dataWithContentsOfURL,线程,与dataTaskWithURL – 有什么区别?

我们正在使用dataWithContentsOfURL,因为它,呃,简单…

NSData *datRaw = [NSData dataWithContentsOfURL:ur]; 

现在,当然,这将挂起主要的UI线程。

所以我们把它放在另一个线程。 我们这样做,

 -(void)performSearch:(NSString *)stuff then:(void(^)(void))after { dispatch_queue_t otherThread =dispatch_queue_create(nil,0); dispatch_queue_t mainThread =dispatch_get_main_queue(); dispatch_async(otherThread, ^{ self.resultsRA = [self ... calls dataWithContentsOfURL ...]; dispatch_async(mainThread, ^{ if (after) after(); }); }); } 

(顺便说一句,这是一个很好的介绍,如果需要https://stackoverflow.com/a/7291056/294884 )

那么现在,苹果说,你不应该使用 dataWithContentsOfURL,他们说你应该改为使用NSSession ..所以, dataTaskWithURL:completionHandler:

我的问题, 是否有任何不同之处 ,使自己的线程(即dataWithContentsOfURL)与使用dataTask?

我们错误地使用 dataWithContentsOfURL:在一个线程,出于某种原因?

PS我很欣赏这是更方便等我的意思是有真正的区别,任何危险,等谢谢!

比起线程同步io更喜欢真正的asynchronousIO的一个原因是线程不是自由的内存。 这通常不是什么大问题,但是可以在应用程序中保存一些内存(更重要的是)在操作系统的内核中保留一点线程内存,不要让一个线程在等待的时候坐在一边无所事事。

我能看到的一些原因:

  • 使用同步请求,您无法知道下载进度,无法恢复下载。 如果您下载大文件并且99%失败,则需要重新下载整个文件。

  • 正如苹果所说:“不要使用这种同步方法来请求基于networking的URL,对于基于networking的URL,这种方法可以在慢速networking上阻塞当前线程几十秒…”。 如果使用GCD,则不会直接控制给定的线程,并且可能会阻塞该线程上的其他重要操作,dataTask调度程序可能会更好地概述系统资源。 如果您手动创build线程,则可能会使用此阻塞的线程重载系统(如果至less已经存在资源负载)。

  • 在dataTaskWithURL:中还有“增加了支持自定义validation和取消的function”。

  • 您可能需要自定义请求标头/正文。 也许它属于“便利”类别,但无论如何这是另一回事。