我有多个使用NSURLSession
的类,它们可能同时运行,如果我将它们全部设为NSURLSession委托,那可以吗?
代码:
第一位代表:
@interface userLoginScreen : UIViewController <UIAlertViewDelegate, NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate>
第二位代表:
@interface syncDataOperation : NSOperation <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate>
这样做是一种好习惯吗?
答案 0 :(得分:1)
所有你在你的例子中都在说&#34;所有这些类都实现了这个接口&#34;,这非常好,并且对运行时实际发生的事情没有真正的影响。
我认为您所处理的是那些您可能希望让单个委托对象从NSURLSession中的多个对象接收委托消息的情况。例如,让一个委托处理多个NSURLSessionTask对象的回调是完全正常的。
唯一真正的问题可能是你要让代理消息进入多个不同的线程/队列。但是,Apple已经为此设计了;当您创建NSURLSession对象时,您可以为要发送的回调提供特定的delegateQueue
。例如,这是delegateQueue
中的sessionWithConfiguration:delegate:delegateQueue
。
如果你没有提供一个,NSURLSession&#34;创建一个串行的NSOperationQueue对象,在其上执行所有委托方法调用和完成处理程序调用&#34;,这是一个非常明智的默认。
您在一个NSURLSession
下创建的任务也将使用该委托队列作为其委托消息。
例如,如果您创建NSURLSession
而未指定delegateQueue
,则会为其委托消息创建一个串行队列。如果您随后在其上调用downloadTaskWithRequest
来创建NSURLSessionDownloadTask
,则下载任务的委托方法将使用相同的队列。
如果你在其上创建三十 NSURLSessionDownloadTask
,所有人都指向同一个委托,他们都会使用相同的队列发送他们的委托消息,因为它&# 39;串行队列,您的代表不会同时到达两个代理邮件,因此您不必担心编码以应对这种情况。 (并且所有委托消息都会传递指向相关NSURLSession
/ NSURLSessionTask
的指针,以便您可以确定哪些消息来自哪些任务。)
通常,您必须处理特定任务集的所有委托对象将处理在同一NSURLSession对象下创建的任务,因此默认情况下所有代理队列都使用相同的委托队列,如果您不打扰传递在一个delegateQueue中,正如我所说,NSURLSession为您提供了一个合理的,所以大部分代表的东西应该只是工作。