可以复制NSURLsession委托类iOS

时间:2014-04-03 22:48:46

标签: delegates duplicates nsurlsession

我有多个使用NSURLSession的类,它们可能同时运行,如果我将它们全部设为NSURLSession委托,那可以吗?

代码:

第一位代表:

@interface userLoginScreen : UIViewController <UIAlertViewDelegate,  NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate>

第二位代表:

@interface syncDataOperation : NSOperation <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate>

这样做是一种好习惯吗?

1 个答案:

答案 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为您提供了一个合理的,所以大部分代表的东西应该只是工作。

相关问题