【iOS】如何优雅快速的大量导入与展示系统照片与视频

news/2024/11/29 20:37:30/

最近接了一个需求,要求增加一个相册导入图片(视频)的功能,具体要求有:

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张图片可以控制在数秒内完成


http://www.ppmy.cn/news/3959.html

相关文章

前端入门学习笔记九十

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><h3>自减运算符</h3><script>var u 9;var k u--;document.write(k);</script></body> </html…

YOLO系列目标检测算法——YOLOR

YOLO系列目标检测算法目录 - 文章链接 YOLO系列目标检测算法总结对比- 文章链接 YOLOv1- 文章链接 YOLOv2- 文章链接 YOLOv3- 文章链接 YOLOv4- 文章链接 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 PP-YOLO- 文章链接 …

Android字体渐变效果

先来看看最初版代码&#xff1a; public class GradualChangeTv extends AppCompatTextView { public Paint mPaint new Paint(); public final String text "android 超级兵";public GradualChangeTv(Context context) {this(context, null); }public GradualCh…

直播弹幕系统(二)- 整合RabbitMQ进行消息广播和异步处理

直播弹幕系统&#xff08;二&#xff09;- 整合RabbitMQ进行消息广播和异步处理前言一. Socket服务整合RabbitMQ二. 弹幕服务创建2.1 创建一个公共maven项目2.2 弹幕服务项目创建2.2.1 创建队列和广播型交换机2.2.2 生产者发送最终弹幕数据2.2.3 消费者监听原始弹幕数据2.3 Soc…

Jmeter简单入门

背景 我们项目中一般测试接口都是用vscode中的REST Client插件&#xff08;推荐好用&#xff09;或者的话postman(适合写一些脚本和文件的上传) 但是他们都有一个不太行的功能&#xff0c;那就是多线程并发测试&#xff0c;其他市面上的什么apipost也都是不支持&#xff0c;网…

MySQL——count(*)的底层实现以及相关优化

在开发系统的时候&#xff0c;可能需要需要计算一个表的行数这时候你可能会想&#xff0c;一条 select count(*) from t 语句不就解决了吗&#xff1f; 但是&#xff0c;会发现随着系统中记录数越来越多&#xff0c;这条语句执行得也会越来越慢。然后可能就想了&#xff0c;My…

Qt新手入门指南——创建一个基于Qt Widget的文本查找器(二)

Qt是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本教程将介绍如何使用…

frp内网穿透https

在公网服务器搭建frps(service)&#xff0c;在内网本地机子搭建frpc(client)&#xff0c;流量通过访问公网ip&#xff0c;经过frps服务端转发到fprc客户端&#xff0c;fprc再转发到本地web应用。 官方下载地址​ https://github.com/fatedier/frp/releases 官方文档地址https…