最近接了一个需求,要求增加一个相册导入图片(视频)的功能,具体要求有:
1、导入速度要非常快,1000张图片需要控制在一分钟,需要复制到本地
2、可以无限制导入,导入数量需要支持10000+
3、需要拿到图片的基本信息,包括位置,尺寸,大小,格式,时长等
所以问题基本就要围绕如何又快又稳定的拿到这些图片,并且显示到界面上。
v1.0版本我做了如下处理:
接入的是一个三方的导入框架QBImagePickerController,界面基本可以符合我的要求,按照正常导入基本流程,拿到了 [PHAsset]
1.控制数量为9张图片(视频)。
2.拿到图片资源后,保存到指定文件夹(app document目录下),并且把路径信息保存到数据库
3.collection加载图片时候,通过URL来加载图片
面临的问题:
1.拿到数量太少,不满足需求,虽然对标的是微信的九张图片或者视频,不过有竞品可以取到所有
2.导入速度过慢,一张图片需要5s+
3.显示速度过慢,跟显示网络图片一样,需要加载
于是有了优化版本
v1.1版本我做了如下处理:
1.增加缩略图,每次导入图片,顺便压缩导入缩略图(240*240),存入本地
2.collection加载图片时候,先看数据库model是否有缓存的缩略图Data,如果有,直接加载,如果没有,尝试加载本地缩略图并缓存,如果本地缩略图没有,加载本地原图并缓存
3.requestImageDataAndOrientation(for: 替代 requestImage(for:,有需要时候再进行Data->UIImage转换 (实测:requestImage(for:很慢,requestImageDataAndOrientation(for: 可以提速不少)
4.扩充图片到支持所有图库
面临的问题:
1.导入图片由于改变存储方式(UIImage->Data)有所提升,依然不够快,大概需要1s+
2.数量过多时候,有闪退存在(大概300张+),无闪退日志
于是有了优化版本
v1.2版本我做了如下处理:
1.工具检查发现是内存溢出,短时间内产生太多对象而没有被回收
2.引入autoreleasepool,控制内存回收
3.拿图片信息延迟处理,除去后续可能需要扩展的基本信息(排序需要用的size,分辨率等),统统在展示基本信息的情况下来获取。
至此,导出图片跟展示基本可以满足需求
1、图片支持过万导入
2、加载预览均很流畅
3、导入速度很快,1000张图片可以控制在数秒内完成
完