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

标签 ios nsurlconnection grand-central-dispatch afnetworking nsoperationqueue

谁能解释一下异步 NSURL 请求与 GCD 和 NSOperationQueues 之间的关系?

我不确定何时使用它们。

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

谢谢!

最佳答案

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

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

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

AFNetworking 是一个很棒的库,它以第三种方式解决了这个问题:它触发一个专用于 NSURLConnectionNSThread代表电话。这是从主线程卸载工作的预 GCD 方式。尽管它有效,但 GCD 提供了一种更有效、更友好的方式来向系统展示您的背景工作。

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

如果您对这个主题感兴趣,GCD 提供的不仅仅是托管 NSURLConnection 委托(delegate)调用,我建议您阅读 Apple 的精彩文章 Concurrency Programming Guide或观看优秀的WWDC 2011 videos关于 GCD(Blocks and Grand Central Dispatch in PracticeMastering Grand Central Dispatch)。

关于ios - 异步 NSURL 请求如何适应大中央调度/操作队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11745059/

相关文章:

iOS SDK : how can I find if a link is download-able?

iOS - 如何在设定的时间后中断异步后台操作

swift - 在带有属性字符串的 UITextView 中显示来自带有占位符的 url 的图像

ios - 为现有的 Xcode 5 项目添加本地仓库

ios - 在 SwiftUI 中更改 ProgressView 的大小(高度)

ios - Xcode Swift - 在苹果 map 上查看输入的邮政编码

ios - 在 iOS 上检测互联网连接的最简单方法?

objective-c - Objective-C 的技巧?

objective-c - 保护我的代码免受来自完成 block 的僵尸

ios - Swift:如何在登录 View 后显示标签栏 Controller