异步NSURL请求如何适应大的中央调度/操作队列



有人能解释异步NSURL请求与GCD和NSOperationQueues之间的关系吗?

我不知道什么时候用。

现在,当我需要获取/上传数据到服务器时,我一直在"摆脱"异步NSURL请求。但有人建议我应该使用GCD。我的问题是,我不知道在现实生活中,GCD会更好。有人有什么常用的用例给我吗?例如,如果我使用GCD来存储一个由10个异步NSURL GET请求组成的队列,这对我有什么好处?在大中央调度队列或NSOperationQueue中包含异步NSURL请求是否有意义?

谢谢!

在您的情况下,特别令人困惑的是,我们混合了HTTP请求队列(其中请求将一个接一个地发送)和操作队列(其中随机计算工作将一个又一个地执行)。

一个标准的NSURLConnection实例在主线程上调用它的委托,如果您当时没有对数据或UI进行复杂的工作,这是可以的。但假设你需要下载一个大文件,并将其作为一个文件一块一块地写在磁盘上,同时向下滚动一个表视图。现在,当您在磁盘上写入数据时,滚动可能会变得不稳定,从而阻塞主线程。

这就是GCD或其更高级别抽象NSOperationQueue发挥作用的地方。为了解决这个问题,您需要从主线程中卸载数据写入调用。您可以通过setDelegateQueue:NSURLConnection上指定一个NSOperationQueue实例来完成此操作。这将确保您的委托,以及您的写入调用,将在后台线程中调用。您也可以将委托调用留在主线程上,并将昂贵的写调用封装在一个块中,然后使用dispatch_async在主线程外执行该块。现在NSOperationQueue基本上封装了一个调度队列,并且通过在原始调度队列上使用它来避免额外的线程切换,所以我推荐NSOperationQueue解决方案(它看起来也更简单)。

AFNetworking是一个很棒的库,它通过第三种方式解决了这个问题:它启动了一个专门用于NSURLConnection委托调用的NSThread。这是GCD之前从主线程中卸载工作的方法。尽管它有效,但GCD提供了一种更高效、更优秀的公民方式,可以向系统展示您的背景工作。

最后,如果你正在寻找一个HTTP请求队列,Cocoa不会提供它。你必须自己构建一个调度程序,或者正如你已经发现的那样,使用AFNetworking,这也是一个很好的选择。

如果你对这个话题感兴趣,GCD除了主持NSURLConnection代表电话外,还有很多东西可以提供,我建议你阅读苹果公司的优秀并发编程指南,或者观看GCD上的优秀WWDC 2011视频(实践中的Blocks和Grand Central DispatchMastering Grand Central Dispatch

这不是主题,但如果你使用AFNetworking Lib,你就不必做上面提到的任何事情。

"AFNetworking是一个适用于iOS和Mac OS X的令人愉快的网络库。它建立在NSURLConnection、NSOperation和其他熟悉的基础技术之上。它具有模块化架构,具有精心设计、功能丰富的API,使用起来很愉快。"

回答您的问题,请阅读此

http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/

最新更新