下载列表实现

2018-10-16  本文已影响0人  小小志伟

下载状态维护:本地

1.为什么本地保存下载状态。

因为本地文件被删除,服务器是不知道的,所以无法记录。(安卓是可以从文件夹删除)

2.手动退出和后台退出造成异常。

1.手动退出: 假设处于下载中,手动退出应用。此时的下载状态应该更新为未下载(没有断点续传)。

2.后台退出同理: 长时间处于后台被系统杀死。

解决法案:1.通过appDelegate回调监听捕捉事件。
2.在app启动时候,数据初始化。

3.本地实现方案:

本地存储方案:1.数据库。
2.key-value

最佳解决方案:使用数据库:下载url-> 下载状态->本地存储文件路径。

对应表结构:

url status destinationUrl
http:url 0 文件路径

根据url找到对应下载状态,并且取到下载路径内容。


UI的更新:Cell的改变

1.cell重用导致下载状态错乱。

因为重用机制:cell上的下载状态会错乱。
例子:屏幕未出现的cell状态:未下载。屏幕第一条数据是下载中。cell重用,造成屏幕未出现的cell状态错乱为下载中。所以必须从model中时时更新。

2.cell下载状态:第一次初始化和下载点击。

既然用本地数据记录,就要第一次从数据库拿到初始数据。
既然用cell重用,就要保证model中数据更新(内存中)。
造成问题:model数据来自网络,下载状态数据来自本地。

解决方案:下载状态的更新统一来自model的数据,可以为model添加一个字段status。第一次网络获取model时候,从本地拿到状态为model赋值。当点击下载时候,根据下载情况,更新对应model的status。并监听model的status,更新cell的界面变化。


并发数的控制

1.NSOperationQuene

Quene有属性maxConcurrentOperationCount最大并发数控制。
注意:只需保证NSOperationQuene初始化一次。

NSOperationQuene的理解:可以看作一条管道,每个操作看作一段水流。(遵循先入先出原则);并发数的控制类似蓄水池。
1.并发数为1:蓄水池有一个管子(NSOperationQuene)流入水池。只有一个水管(并发数的控制)流出水。此时只开启一个异步线程。
2.并发数为10:蓄水池有一个管子(NSOperationQuene)流入水池。同时10个水管(并发数的控制)流出水。此时开启10个异步线程。

下边是还没来得及实现:

2.GCD


断点续传


下载进度

上一篇下一篇

猜你喜欢

热点阅读