我有一个从Flickr下载几张照片的应用程序。现在,所有照片都是通过NSOperation
上运行的自定义NSOperationQueue
课程下载的。但是,我听说NSUrlConnection
异步更有效率,并且想知道哪个更好情况?或者,是否有第三种选择甚至比这两种更好?
自定义NSOperation
只需在不同照片上多次调用[NSData dataWithContentsOfURL:]
即可。
答案 0 :(得分:5)
如果你另外考虑这些方面,那么使用一种利用NSOperation的子类并封装在异步模式下使用的NSURLConnection(实现委托协议)的方法可能是最有效的:
确保NSOperation子类快速处理委托方法 ,并且不将底层线程(或队列)用于处理响应数据。理想情况下,委托方法将部分响应数据传递给处理它们的另一个队列或线程(注意:图像数据可以预加载到后台线程或队列中!)。
这样做的原因是,网络操作越早完成,每次执行的请求就越多。网络NSOperation应放入NSOperationQueue,其最大并发操作数设置为1或2.很少为4或更高。此设置取决于服务器是否支持流水线操作以及连接速度。将该队列命名为“网络绑定队列”。
“数据处理”(预加载图像数据)任务理想情况下也是NSOperation的子类。同样,“数据处理”操作应该在CPU绑定的NSOperationQueue中排队。默认情况下,NSOperationQueue的最大并发操作已经适用于CPU绑定操作。
如果要将数据再次保存到磁盘,理想情况下,您需要创建NSOperation并将这些磁盘操作排入“磁盘绑定队列”。在设备上,这似乎没有必要,但如果你仍然有这么古老的“磁盘” - 将最大并发操作数设置为磁盘独立磁头数是有意义的。 ;)
嗯,当连接速度非常快并且您能够在同一时间处理那么多数据时,这一切都可能只会产生影响。我们在设备上讨论的是每秒5 MB,在实验室顶部可能是每秒25 MB。
答案 1 :(得分:0)
尝试这些教程可能会对您有所帮助:
http://maniacdev.com/2010/03/easier-threading-with-nsoperation-for-better-performance
http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues
http://www.icodeblog.com/2012/10/19/tutorial-asynchronous-http-client-using-nsoperationqueue/
OR
如果您要下载照片并在表格单元格中显示照片,则可以使用Lazy loading images.
答案 2 :(得分:0)
我建议使用AFNetworking(AFNetworking on Github) 它具有排队操作的内置功能。 如果仅使用它来加载需要在表格视图单元格中显示的图像,则可以使用UIImageView上的AFNetworking类别异步加载这些图像。