2014-06-27 45 views
0

我创建了一个简单的测试应用程序,以了解如何使用NSURLSession。这个应用程序必须从web服务下载图像,并将它们呈现为UITableView。 我已经写了应用程序的第一部分,它从Web服务读取图像URL列表,现在我想显示这个列表。使用NSURLSession下载大量图像

我的疑问是:

因为图像列表中可能是一个很长的名单,是它确定为每个图像的NSURLSessionDownloadTask? 我想在cellForRowAtIndexPath函数中创建会话并将NSURLSessions存储在NSDictionary中,使用该单元格的IndexPath作为关键字(并且可能依靠NSURLCache避免多次下载相同的图像)。

其他解决方案

我可以看到三个解决方案:

  1. 使用GCDdispatch_async

  2. 子类的NSOperation和基本存储的NSOperation因为我需要下载任何图像。

  3. 使用第三方库如AFNetwork ...但由于它是一个学习目的的应用程序,我宁愿完全使用我的代码 。

如果多个NSURLSession不是一个好的解决方案,我会选择其中一个选项。

您对这种方法有什么看法?

+0

就我而言,我使用过GDC,对我来说这也是一个不错的选择。 –

+0

考虑向后兼容性。 'NSURLSession'只存在于iOS7 +中。 – Eonil

回答

5

NSURLSessionTask适用于大量的下载。它与其他一些您提到的方法相比的一个优点是可以取消或暂停下载。它还能够正确地实现网络操作的并发性,这比网上许多猫会让你相信的难度要大(如果你不相信我,请查看爱斯基摩人的2010年WWDC会话和示例代码)。网络连接的NS操作并不是微不足道的)。

NSURLSessionTask和朋友是专为您正在尝试解决的各种问题而设计的,并且经过了很好的测试。

对于桌面视图,在tableView:willDisplayCell:forRowAtIndexPath:中启动任务并取消(或暂停)tableView:didEndDisplayingCell:forRowAtIndexPath:中的任务。这将限制活动下载到当前可见的单元格。

3

建议:

我也碰到过类似的情况是我需要下载约2000图像文件和100个视频文件。为此,我实现了一个使用NSOperationQueue和块的自定义下载管理器。

我已将此库添加到GitHub,请随时查看实施情况。

1

IMO虽然可以为每个图像创建一个NSURLSessionTask标准的先进先出实现会在滚动单元格时导致问题。原因是下载将在NSURLSession上排队,并且任务将按照它们添加到队列中的顺序执行,换句话说就是以FIFO的方式执行。想象一下你已经在大量的单元格中滚动的场景,你必须等待所有的下载顺序完成。您不仅需要等很长时间,还会对可能不再与用户相关的图像资源发出不必要的网络请求。

Nick Lockwood创建了一个很好的NSOperationQueue子类,名为NSOperationStack,它颠倒了操作的顺序,以便最后执行的操作(LIFO)。 IMO需要大量下载LIFO实施。

NSOsperationStackhere

如果合并这与使用cellForRowAtIndexPath发起并NSURLCache来存储下载的实现,你应该结束了一个非常精简,高效的解决方案。

1

我会使用(或至少看看)SDWebImageSDWebImageManager

除了下载,你可以设置优先级,并继续在我认为你会想要的背景选项。