NSOperation Queue vs NSUrlConnection async

cha*_*eyh 1 asynchronous objective-c nsurlconnection nsoperation ios

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

Cou*_*per 5

使用一种利用NSOperation的子类并封装NSURLConnection并在异步模式下使用的方法(实现委托协议)可能是最有效的,如果你另外考虑这些方面:

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

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

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

如果要将数据保存到磁盘,理想情况下,您需要创建NSOperation并将这些磁盘操作排入"磁盘绑定队列".在设备上,这似乎没有必要,但如果你仍然有这么古老的"磁盘" - 将最大并发操作数设置为磁盘独立磁头数是有意义的.;)

好吧,当连接速度非常快并且您能够在同一时间处理那么多数据时,这一切都可能只会产生差异.我们在设备上讨论的是每秒5兆字节,在实验室顶部可能是每秒25兆字节.

  • +1我同意大部分内容.我可能只会狡辩re'maxConcurrentOperationCount`,我通常设置为4或5,我发现它提供了超过1或2的巨大性能提升.绝对不超过4或5,但使用大于1或2的值可能会导致在实质性的改进. (2认同)
  • @CouchDeveloper我同意将其限制为4或5.它不仅使您的应用程序成为"好公民"(即从服务器角度来看),但根据我的经验,您不能超过5个`NSURLConnection`请求同时,无论如何(如果超过5个,只有5个实际上会同时运行,后续请求将会冻结,更糟糕的是,如果在60秒内未启动则会超时并失败).根据我的经验,4或5次平衡表现,负责任的公民和"NSURLConnection"限制. (2认同)