很多app都有展示文件的需求,不需要额外添加信息的话,可以直接读取用户磁盘目录下的所有文件展示给用户。但是要给文件赋予定制属性(比如文件来源),就要建立自己的文件系统。本文主要讲述自定义文件系统和遇到的一些问题。
放上demo链接
思路
- 数据库中存储自定义的文件信息和文件路径
- 读取数据库,展示文件信息
- 需要时,根据数据库存储的地址找到对应文件
遇到的问题
- 文件更新丢失
比如【文件列表页面】和【收发记录页面】都从数据库中分别取出了文件模型,两个页面分别对文件做了更新,这个时候先更新到数据库的部分就会被后面的更新覆盖。 - 更新界面困难
每次数据更新,要把所有更新写入数据库,再通知首页从数据库中重载数据更新界面,如果是像进度条这样需要频繁更新的需求,会很卡。
解决方案
- 在数据库和业务之间,加一层中间件(FileManager)。
FileManager保证了每一条数据库中的数据只对应一个内存中的数据模型,确保所有更改都是在同一份数据上进行 - 在使用中间件的基础上,使用kvo绑定数据和界面
更新界面有三种选择
- 方法一:每次更新都使用 [tableview reloadData]
缺点:增加不必要损耗,如果界面上有更新进度条,会频繁reloadData;每次数据更新都需要手动调用更新界面的方法 - 方法二:使用delegate或者block更新特定cell
缺点:每次数据更新都需要手动调用更新界面的方法 - 方法三:kvo
缺点:易崩溃,推荐使用FBKVOController
其他功能点:重名文件命名
目标效果:导入了“xxx.png”,第二次导入会变成“xxx-1.png”,第三次导入变成“xxx-2.png”。 这样判断重名需要两个材料:1)基础名 2)重名后缀 获取这两个材料我们有两种方式:
- 实时计算 按照重名规则截取文件名,实时复原文件基名(基本文件名)和index(重名后缀)
- 存储 在新建文件模型的时候,就存储文件重名index,和基名
个人倾向使用存储的方式,这样能将展示名和重名数据分开,每次展示的时候根据基础名和后缀灵活组建文件名