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

时间:2012-07-31 16:44:52

标签: ios nsurlconnection grand-central-dispatch afnetworking nsoperationqueue

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

我不确定何时使用它们。

现在,当我需要将数据提取/上传到服务器时,我一直在“逃避”异步NSURL请求。但有人建议我应该使用GCD。我的问题是我不知道现实生活中的例子GCD会更好。有没有人对我有任何常见用例?例如,如果我使用GCD存储10个异步NSURL GET请求的队列,这对我有什么好处?在中央调度队列或NSOperationQueue中有异步NSURL请求是否有意义?

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

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

AFNetworking是一个很棒的库,它以第三种方式解决了这个问题:它会触发专用于NSThread委托调用的NSURLConnection。这是从主线程卸载工作的前GCD方式。虽然它有效,但GCD提供了一种更有效,更好的公民方式,可以将您的后台工作呈现给系统。

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

如果你对这个话题感兴趣,GCD除了主持NSURLConnection委托电话之外还有很多东西可以提供,我建议你阅读Apple的精彩Concurrency Programming Guide或观看优秀{{3} GCD上的< Block和Grand Central Dispatch in Practice 掌握Grand Central Dispatch )。

答案 1 :(得分:1)

这不是主题,但如果您使用AFNetworking Lib,则无需执行上述任何操作。

“AFNetworking是适用于iOS和Mac OS X的令人愉快的网络库。它建立在NSURLConnection,NSOperation和其他熟悉的Foundation技术之上。它采用模块化架构,设计精良,功能丰富的API令人愉悦使用。“

回答你的问题,请阅读

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