我们正在使用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,这里是一个很好的介绍。)
现在,Apple说你不应该使用 dataWithContentsOfURL,他们说你应该只使用NSSession。所以,dataTaskWithURL:completionHandler:
我的问题是,在制作我们自己的线程(即使用dataWithContentsOfURL)与使用dataTask之间是否存在任何差异?
我们在一个线程上使用dataWithContentsOfURL是不对的?出于某种原因?我很欣赏它更方便,等等。我的意思是存在真正的差异,任何危险等等。
答案 0 :(得分:2)
优先选择真正的异步io而非线程同步io的一个原因是线程不是内存自由的。一般来说这不是什么大不了的事,但你可以在你的应用程序中节省一点内存,并且(更重要的是)在操作系统的内核中保留一点点有线内存,而不是让一个线程在等待时无所事事。
答案 1 :(得分:1)
我可以看到的一些原因:
使用同步请求,您无法了解下载进度,也无法恢复下载。如果您下载大文件并且失败率为99%,则需要重新下载整个文件。
Apple指出"请勿使用此同步方法来请求基于网络的网址。对于基于网络的URL,此方法可以在慢速网络上阻止当前线程数十秒......"。如果您正在使用GCD,则无法直接控制给定的线程,并且可能会阻止该线程上的其他一些重要操作,dataTask调度程序可能更好地概述系统资源。如果您手动创建线程,则可能会使用此阻塞线程使系统超载(如果已经存在资源压力)。
此外,还增加了支持自定义身份验证和取消功能的功能。在dataTaskWithURL中:。
您可能需要自定义请求标头/正文。也许它属于"方便"类别,但无论如何它是另一回事。