有一个单例类,所谓的RequestManager,它将处理由我的应用程序的不同模块和后台任务发出的请求.
@interface RequestFactory : NSObject
- (void)requestDataWith:(NSString *)token
id:(NSString *)id
sender:(id<RequestFactoryDelegate>)sender;
...
@end
Run Code Online (Sandbox Code Playgroud)
然后我得到另一个类,所谓的SessionDelegate,它将处理请求期间的所有回调.
@interface SessionDelegate : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate>
@property (weak, nonatomic) id <RequestFactoryDelegate> delegate;
@end
Run Code Online (Sandbox Code Playgroud)
我的想法是将函数封装在这些类中以不重载我的类,因为我需要很多带有CommonCrypto的辅助类等等.
因此,我快速编写了一个协议RequestFactoryDelegate,将接收到的数据发送给发起原始请求的发送方.
- (void)requestDataWith:(NSString *)token
id:(NSString *)id
sender:(id<RequestFactoryDelegate>)sender
{
self.sessionDelegate.delegate = sender;
NSMutableURLRequest *request = //create the request here
NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithRequest:request];
[dataTask resume];
}
Run Code Online (Sandbox Code Playgroud)
好吧,如果我有一个对象,它可以工作,我们称之为senderA发送请求,因为set delegate总是senderA本身.
问题出现了另一个对象,例如senderB发送请求 - 甚至不是在同一时间 - 但在senderA发送后不久.
- (void)foo
{
[requestFactory requestDataWith:token
id:id
sender:senderA]; // let's assume this takes 20s
[requestFactory requestDataWith:token
id:id
sender:senderB]; // …Run Code Online (Sandbox Code Playgroud)