objective-c - NSURLSession 委托(delegate) : How to implement my custom SessionDelegate class accordingly?

标签 objective-c ios7 nsurlrequest delegation nsurlsession

有一个单例类,称为 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)RequestFactoryDe​​legate,将接收到的数据发送给发起源请求的发送者。

- (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/

相关文章:

ios - ARC 异步 block 最佳实践

ios - 确定通过 NSURLConnection 收到的消息是否完整?

ios - 检测插入的单元格,然后使其成为FirstResponder

ios - 如何测试 SKPaymentTransactionStateDeferred?

ios - 如何从推特提要中获取 "images"以显示在 iOS 应用程序中

ios - 显示键盘时如何决定滚动哪个 UIScrollView

ios - 如何确定 GMSMarker 是否在 GMSPolygon 内部(iOS Google Map SDK)

ios - 你能用IOS7.1 SDK使用XCode6.3吗

ios - 在 iOS7 中使用 UISearchBar 向 tableHeaderView 添加 subview 行为不当

iOS HTTP 请求被调用两次