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