下载状态维护:本地
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个异步线程。
下边是还没来得及实现:
网友评论