【问题标题】:NSOperation Queue vs NSUrlConnection asyncNSOperation 队列与 NSUrlConnection 异步
【发布时间】:2013-05-24 04:02:47
【问题描述】:

我有一个应用程序正在从 Flickr 下载几张照片。现在,所有照片都是通过在NSOperationQueue 上运行的自定义NSOperation 类下载的。但是,我听说NSUrlConnection 异步更有效,想知道哪种情况更好?或者,有没有比这两个更好的第三种选择? 自定义NSOperation 只是在不同的照片上多次调用[NSData dataWithContentsOfURL:]

【问题讨论】:

  • 我都做了。吞吐量相当,NSOperation 方法更简单、更优雅。话虽如此,在不知道自定义NSOperation 的作用的情况下很难评估它的效率。第三种选择是像AFNetworking 这样的杠杆框架。
  • 如果我们在推荐第三方网络库,有AFNetworkKit值得考虑。
  • @CouchDeveloper AFNetworkKit?你的意思是MKNetworkKit?关于 OP 的问题,我喜欢 AFNetworking 为网络操作创建专用线程的事实,而不是 MKNetworkKit 所做的,即将网络操作添加到主队列。在大多数情况下,它们应该是等价的,但网络线程的隔离似乎是谨慎的。
  • 我同意@Rob 的观点,AFNetwork 似乎更可取,因为用户在加载过程中会坐在那里一段时间,我需要在主线程上运行 MBProgressHUD。

标签: ios objective-c asynchronous nsurlconnection nsoperation


【解决方案1】:

如果您还考虑以下方面,则使用利用 NSOperation 的子类并封装异步模式下使用的 NSURLConnection 的方法(实现委托协议)可能是最有效的:

确保 NSOperation 子类快速处理委托方法,并且不会使用底层线程(或队列)处理响应数据。理想情况下,委托方法将部分响应数据传递到另一个队列或线程处理它们(注意:图像数据可能预加载在后台线程或队列中!)。

这样做的原因是,网络操作越早完成,每次可以执行的请求就越多。网络 NSOperation 应放入最大并发操作数设置为 1 或 2 的 NSOperationQueue 中。很少设置为 4 或更高。此设置取决于服务器是否支持流水线以及连接速度。将该队列命名为“网络绑定队列”。

“数据处理”(预加载图像数据)任务在理想情况下也是 NSOperation 的子类。同样,“数据处理”操作应该在 CPU 绑定的 NSOperationQueue 中排队。默认情况下,NSOperationQueue 的最大并发操作已经适合 CPU 绑定操作。

如果您想将数据保存到磁盘,那么理想情况下,您可以创建一个 NSOperation 并将这些磁盘操作排队在“磁盘绑定队列”中。在设备上,这似乎没有必要,但如果您仍然有这么旧的“磁盘” - 将最大并发操作数设置为磁盘的独立磁头数是有意义的。 ;)

好吧,当连接速度非常快并且您能够同时处理这么多数据时,这一切可能会有所不同。我们说的是设备上每秒 5 MB,而实验室顶部可能是每秒 25 MB。

【讨论】:

  • +1 我同意其中的大部分内容。我可能只会对我通常设置为 4 或 5 的 maxConcurrentOperationCount 提出质疑,我发现它比 1 或 2 提供了巨大的性能改进。绝对不超过 4 或 5,但使用大于 1 或 2 的值可能会导致大幅提升性能。
  • 哇,必须同意你听到的。我将其从 1 更改为 4,并看到了巨大的性能提升。
  • 这是您必须在真实环境中测试的内容。通常,如果连接稳定且快速,则您会在 2 个或更多并发网络操作时看到更好的性能。当您的连接速度非常快 (LTE) 时,您可能无法处理这些数据,即使您将工作分配到所有可用的 CPU 上;)
  • @CouchDeveloper 我同意将其限制为 4 或 5。它不仅使您的应用程序成为“好公民”(即从服务器的角度来看),而且根据我的经验,您不能拥有更多无论如何,超过 5 个 NSURLConnection 请求同时进行(如果超过 5 个,实际上只有 5 个会同时运行,后续请求将冻结,更糟糕的是,如果在 60 秒内未启动,则会超时并失败) .以我的经验,4 或 5 平衡绩效、负责任的公民和NSURLConnection 约束。
  • 我完全同意——很高兴知道 NSURLConnection 将实际打开的套接字的数量限制在一个合理的值。 ;)
【解决方案2】:

【讨论】:

【解决方案3】:

我会推荐使用 AFNetworking (AFNetworking on Github) 它具有用于排队操作的内置功能。 如果你只使用它来加载需要在表格视图单元格中显示的图像,你可以使用 UIImageView 上的 AFNetworking 类别来异步加载这些图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2012-09-19
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多