小编Kun*_*uno的帖子

NSURLSession委托:如何相应地实现我的自定义SessionDelegate类?

有一个单例类,所谓的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的辅助类等等.

因此,我快速编写了一个协议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];
}
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)

delegation objective-c nsurlrequest ios7 nsurlsession

3
推荐指数
2
解决办法
5017
查看次数