我们正在使用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是错误的吗?我很欣赏它更方便,等等。我的意思是有真正的区别,任何危险等等。
更喜欢真正的异步io优于线程同步io的一个原因是线程不是内存自由的。一般来说这不是什么大不了的事,但你可以在你的应用程序中节省一点内存,并且(更重要的是)在操作系统的内核中保留一点点有线内存,而不是让一个线程在等待时无所事事。
我能看到的一些原因: