1

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

4

3 回答 3

5

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

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

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

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

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

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

于 2013-05-24T14:31:05.270 回答
0

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

于 2013-05-24T09:08:44.073 回答
0

试试这些教程可能会帮助你:

  1. http://maniacdev.com/2010/03/easier-threading-with-nsoperation-for-better-performance

  2. http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

  3. http://www.icodeblog.com/2012/10/19/tutorial-asynchronous-http-client-using-nsoperationqueue/

或者

如果您正在下载照片并在表格单元格中显示它们,那么您可以使用延迟加载图像。

于 2013-05-24T05:00:54.280 回答