有一个单例类,称为 RequestManager,它将处理由我的应用程序的不同模块和后台任务发出的请求。
@interface RequestFactory : NSObject
- (void)requestDataWith:(NSString *)token
id:(NSString *)id
sender:(id<RequestFactoryDelegate>)sender;
...
@end
然后我得到了另一个类,称为 SessionDelegate,它将处理请求期间的所有回调。
@interface SessionDelegate : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate>
@property (weak, nonatomic) id <RequestFactoryDelegate> delegate;
@end
我的想法是将函数封装在这些类中,以免使我的类重载,因为我需要很多带有 CommonCrypto 的辅助类等等。
于是我赶紧写了一个协议(protocol)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];
}
好吧,如果我有一个对象,它就可以工作,让我们称它为发送请求的 senderA,因为设置的委托(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]; // let's assume this takes 1s
}
因为senderA的请求还在进行中,所以senderB将delegate设置给他,结果是senderB的delegate函数运行了两次。
<senderB>
<senderB>
好吧...我真的需要实现一个自己的自定义委托(delegate)(无论是否与 RequestFactory 在同一个类中),但是如何处理回调方法以便我可以正确响应 senderA 或 senderB?
我最后的想法是覆盖 NSURLSessionTasks 类并实现自己的委托(delegate)属性或 block 属性或其他任何东西。
非常感谢。
最佳答案
您可以将任意对象附加到任务:
NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL:url];
id whatever = // anything at all!
[NSURLProtocol setProperty:whatever forKey:@"thing" inRequest:req];
NSURLSessionDownloadTask* task = [[self session] dataTaskWithRequest:req];
稍后(在委托(delegate)中)像这样检索它:
NSURLRequest* req = task.originalRequest;
id thing = [NSURLProtocol propertyForKey:@"thing" inRequest:req];
这里的值(whatever
)可以是任何对象。它可以是一个完成处理程序回调 - 我已经做到了,它工作得很好。
关于objective-c - NSURLSession 委托(delegate) : How to implement my custom SessionDelegate class accordingly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18992257/