实现的需求包括:文档列表、下载列表(包含删除功能)、文档详情、预览和搜索,若无法在app内打开则需要提供在其他app打开的能力。
简单来说,文档下载和管理的实现在技术上没有多大难度,但这里的方案实现了以下几点:
1. 基于nsurlsession的后台下载,并在任务被系统中断后的恢复(比如app被手动kill, 这种情况下本方案采取的策略是自动恢复下载)
2. 在其他app中打开,通过UIDocumentInteractionController实现相应的功能;并且由于该类没有提供一个直接判断的方法(必须要尝试打开时才可以得到是否能够打开),这里的trick是通过QLPreviewController的canPreviewItem方法,需要构造一个对象。 这两个里面的url参数必须要通过fileURLWithPath创建,和我们通常的做法不同;若使用urlwithString会导致crash.
3. 合理的分层结构(这很重要,我们就可以替换不同层次的实现,比如替换持久化方案,替换model层的具体实现等),选择恰当的持久化方案,并将其和内存存储相结合,以实现一个比较好的体验(这里不太好展开说,跟需求相关性较大)。
4.基于时间戳的接口刷新机制;这里的文档树通过单个接口一次性返回,因此我们通过时间戳的机制来优化拉数据的体验。
5. 其他的一些异常处理,比如之前下载的文件在文档树中被删除后本地的展示;缓存清空后的体验;恢复下载的进度等。
6. 作为一个下载相关的应用,还需要保证你所下载的文件和其中间文件都是可清理的,并且在磁盘空间不足时需要做相应的保护处理以及UI提醒等。
总的来说,若要实现一个较好的体验,还是有很多细节需要关注;代码层次结构和持久化方案上也有很多值得推敲的地方。