dataWithContentsOfURL(threaded)和dataTaskWithURL之间有什么区别吗?

时间:2014-07-29 11:48:58

标签: ios multithreading grand-central-dispatch nsdata

我们正在使用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是不对的?出于某种原因?我很欣赏它更方便,等等。我的意思是存在真正的差异,任何危险等等。

2 个答案:

答案 0 :(得分:2)

优先选择真正的异步io而非线程同步io的一个原因是线程不是内存自由的。一般来说这不是什么大不了的事,但你可以在你的应用程序中节省一点内存,并且(更重要的是)在操作系统的内核中保留一点点有线内存,而不是让一个线程在等待时无所事事。

答案 1 :(得分:1)

我可以看到的一些原因:

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

  • Apple指出"请勿使用此同步方法来请求基于网络的网址。对于基于网络的URL,此方法可以在慢速网络上阻止当前线程数十秒......"。如果您正在使用GCD,则无法直接控制给定的线程,并且可能会阻止该线程上的其他一些重要操作,dataTask调度程序可能更好地概述系统资源。如果您手动创建线程,则可能会使用此阻塞线程使系统超载(如果已经存在资源压力)。

  • 此外,还增加了支持自定义身份验证和取消功能的功能。在dataTaskWithURL中:。

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