use*_*719 0 nsurlconnection nsoperationqueue grand-central-dispatch ios afnetworking
有人能解释异步NSURL请求与GCD和NSOperationQueues之间的关系吗?
我不确定何时使用它们.
现在,当我需要将数据提取/上传到服务器时,我一直在"逃避"异步NSURL请求.但有人建议我应该使用GCD.我的问题是我不知道现实生活中的例子GCD会更好.有没有人对我有任何常见用例?例如,如果我使用GCD存储10个异步NSURL GET请求的队列,这对我有什么好处?在大型中央调度队列或NSOperationQueue中有异步NSURL请求是否有意义?
谢谢!
在你的情况下,特别令人困惑的是我们混合了一个HTTP请求队列(其中请求将一个接一个地发送)和一个操作队列(其中随机计算工作一个接一个地执行).
标准NSURLConnection实例在主线程上调用其委托,如果您当时没有对数据或UI进行复杂的工作,则可以.但是,你需要下载一个大文件并将其作为磁盘上的文件写入块,同时向下滚动表格视图.现在,当您在磁盘上写入数据时,滚动可能会变得不稳定,阻塞主线程.
这就是GCD它的高级抽象NSOperationQueue发挥作用的地方.要解决此问题,您需要从主线程卸载数据写入调用.您可以通过NSOperationQueue在NSURLConnectionvia 上指定实例来实现setDelegateQueue:.这将确保您的委托,因此您的写入调用将在后台线程中调用.您还可以将委托调用保留在主线程上,并将昂贵的写入调用包装在一个块中,然后您将在主线程中执行该操作dispatch_async.现在NSOperationQueue基本上包装了一个调度队列,并且你通过在原始调度队列上使用它来避免额外的线程切换,所以我建议NSOperationQueue解决方案(这看起来也更简单).
AFNetworking它是一个很棒的库,它以第三种方式解决了这个问题:它触发了一个NSThread专门用于NSURLConnection委托调用的文件.这是从主线程卸载工作的前GCD方式.虽然它有效,但GCD提供了一种更有效,更好的公民方式,可以将您的后台工作呈现给系统.
最后,如果您正在寻找HTTP请求队列,Cocoa不会提供它.您必须自己构建一个调度程序,或者您已经想到它的使用AFNetworking,这也是一个很好的选择.
如果你对这个主题感兴趣,GCD除了主持NSURLConnection委托电话之外还有很多东西可以提供,我建议你阅读Apple的优秀并发编程指南,或者观看GCD上的优秀WWDC 2011视频(Block and Grand Central Dispatch in Practice并掌握大中央调度).
| 归档时间: |
|
| 查看次数: |
2816 次 |
| 最近记录: |