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

问题描述 投票:1回答:2

我们正在使用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是错误的吗?我很欣赏它更方便,等等。我的意思是有真正的区别,任何危险等等。

ios multithreading grand-central-dispatch nsdata
2个回答
2
投票

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


1
投票

我能看到的一些原因:

  • 使用同步请求您无法了解下载进度且无法恢复下载。如果您下载大文件并且失败率为99%,则需要重新下载整个文件。
  • 正如Apple所说:“不要使用这种同步方法来请求基于网络的URL。对于基于网络的URL,这种方法可以在慢速网络上阻止当前线程持续数十秒......”。如果您使用的是GCD,则不会直接控制给定的线程,并且可能会阻止该线程上的其他一些重要操作,dataTask调度程序可能会更好地概述系统资源。如果您手动创建线程,则可能会使用此阻塞线程使系统超载(如果已经存在资源压力)。
  • 此外,dataTaskWithURL中还有“添加支持自定义身份验证和取消的功能”:
  • 您可能需要自定义请求标头/正文。也许它属于“便利”类别,但无论如何它是另一回事。
© www.soinside.com 2019 - 2024. All rights reserved.