NSOperation Queue vs NSUrlConnection async

时间:2013-05-24 04:02:47

标签: ios objective-c asynchronous nsurlconnection nsoperation

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

答案 1 :(得分:0)

答案 2 :(得分:0)

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