iOS 异步加载本地图片

问题

当某个界面使用系统API + (nullable UIImage *)imageNamed:(NSString *)name;加载了过多本地图片资源时,不可避免的会产生卡顿感。

有过instrument中Time Profiler经验的同学应该有数据上的直观体验,调用imageNamed:首次加载某张图片,往往是最耗时的。

I/O操作:首次加载本地图片时,内存中是没有的,因此去磁盘中加载图片。

解码:解码图片,将位图数据还原成原始像素数据。

以上两步都是imageNamed:方法在底层做的耗时操作。知道原因,那么方案也就有了,将以上操作放入到子线程中。

方案1

有些同学可能想,在子线程调用imageNamed:先提前加载一次图片,并且系统会帮我们缓存,省事省力省心,美滋滋~但是这里有两个坑:

线程安全问题,该方法在iOS9以后才线程安全,也就是说iOS9以下版本使用有风险;

15486648779770.jpg

效率问题,将imageNamed:方法放入到子线程调用,使用Time Profiler观察会发现,该方法在子线程耗时比在主线程久的多,猜测为了保证线程安全,底层很多加锁的操作导致;

方案2

那么美滋滋的不行,只能绕一点远路了;

加载图片

// I/O将磁盘数据加载入内存中,NSData类型

+ (nullable instancetype)dataWithContentsOfFile:(NSString *)path;

// 将NSData类型的图片数据转为UIImage类型

- (nullable instancetype)initWithData:(NSData *)data scale:(CGFloat)scale NS_AVAILABLE_IOS(6_0);

解码图片

站在前人肩膀上敲代码很方便,如果你的项目中使用了SDWebImage或YYImage的话,可以直接调用它们框架内部的解码图片方法;

YYImageDecoder类

- (instancetype)imageByDecoded;

SDWebImageDecoder类

+ (UIImage *)decodedImageWithImage:(UIImage *)image;

它们内部逻辑相似:获取imageA对象位图的信息(透明通道、缩放系数、宽高),创建渲染的上下文(CGBitmapContextCreate),将位图渲染在上下文中(CGContextDrawImage),在上下文中提取带有位图信息的imageB对象(CGBitmapContextCreateImage);

缓存

这样子系统就不会帮我们缓存图片了,因为需要我们自己管理缓存图片。

使用YYThreadSafeDictionary线程安全的容器,子线程保存下解码后的图片。

以上几步操作都是在子线程中,降低了主线程的占用,可以有效的解决由于加载本地图片造成的卡顿问题。当在子线程处理完图片后,我们再切换到主线程,将图片扔给使用方。

// 调用接口大致这样

+ (void)asyncLoadImgWithimgName:(NSString *)imgName block:(void(^)(UIImage *image))block;

以上就是项目中使用的一个小优化方案,如果同学们其他idea,希望不吝赐教。

ios html异步加载图片,iOS 异步加载本地图片相关推荐

  1. ios swift5 UIImage和Data互转 通过url获取本地图片

    文章目录 1.示例 1.1 从打印结果可以看出,data转成image前count为206752字节,image.pngData()为1260163字节,image.jpegData(compress ...

  2. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18730223),请尊重他人的辛勤劳动成果,谢谢! 写这篇文 ...

  3. java实现本地图片转urljava中映射本地图片地址为url访问

    1.编写一个工具类PhotoUtils实现WebMvcConfigurer,然后重写addResourceHandlers方法即可 @Component public class PhotoUtils ...

  4. thymeleaf 使用图片url或者上传本地图片

    配置文件: # 声明图片的绝对路径和相对路径 file.upload.path=F://images/ file.upload.path.relative=/images/** 配置类: import ...

  5. idea 设置加载多个资源文件,显示本地图片

    idea 经常只会设置一个资源路径,这个路径就是项目的路径.但是当要加载的文件处于其他位置时,则需要增加虚拟路径的配置. 如图:第一个是项目路径 第二个是图片路径 转载于:https://www.cn ...

  6. Java接收并上传图片至S3,返回图片URL,并删除本地图片

    Java将图片上传至S3,一般前端页面上传过来的图片,在后端接收形式都为MultipartFile,而S3不支持MultipartFile形式的文件,只支持File类型,所以需要先转换类型再上传.注意 ...

  7. Android 使用开源库StickyGridHeaders来实现带sections和headers的GridView显示本地图片效果...

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/20481185),请尊重他人的辛勤劳动成果,谢谢! 大家好! ...

  8. android 点动态显示图片,Android用RecyclerView实现动态添加本地图片

    本文介绍了Android用RecyclerView实现动态添加本地图片,分享给大家,具体如下: 简单介绍一下用法: 1.跳转到图片选择页面: Intent intent = new Intent(Pa ...

  9. java 获取百度云盘图片_java 利用百度云识别图片文字

    一.百度云使用步骤 1.进入https://console.bce.baidu.com/#/index/overview 登录百度云账号.百度所有账号都是通用的,可以直接利用百度的其他账号(百度网盘. ...

  10. 用RecyclerView实现动态添加本地图片

    本文所用的多图选择的library来自:https://github.com/lovetuzitong/MultiImageSelector 简单介绍一下用法: 1.跳转到图片选择页面: Intent ...

最新文章

  1. Pytorch中的广播机制
  2. plsql测试oracle存储过程,oracle存储过程基本结构的编写与plsql测试执行
  3. Xamarin.Forms的滚动视图ScrollView
  4. VC程序编译成exe后需msvcr100.dll、msvcp100.dll才能运行的解决方法
  5. 【控制】蚁群算法(ACO,Ant Colony Optimization)及 Matlab 实现
  6. 从切比雪夫不等式到大数定理
  7. Windows 创建 Redis 和 zookeeper 系统服务
  8. Heavyocity PUNISH Lite for Mac - 虚拟自动音频增强效果器
  9. PHP项目性能优化-总览
  10. CCF推荐期刊/会议历年发表论文数据库:CCF Rec-Paper DB
  11. 大气压力换算公式_压力公式换算
  12. GDI+ C 画图 输出文字
  13. 计算机应用基础课考试题B,大工《计算机应用基础》课程考试模拟试卷B
  14. 《计算机通信与网络》学习笔记
  15. mac os 更改mac地址
  16. 睿智的目标检测——YoloV7-Tiny-OBB旋转目标检测算法部署
  17. java解释单片机按高位在前低位在后协议输出的数字
  18. 子之错父之过什么意思_子不教父之过是什么意思?
  19. 关于插件open-browaer-webpack-plugin
  20. 从可回收火箭到AI向善 - 独家专访SpaceX前核心工程师Keenan Johnson

热门文章

  1. win xp开机报错|内存不能为written
  2. 如何查看电脑上是否安装有IIS服务
  3. 原型和构造函数(1)
  4. Java套接字Socket编程--TCP参数
  5. The Clean Architecture--一篇很不错的关于架构的文章
  6. 推荐一个很棒的JS绘图库Flot
  7. 如何进行需求矩阵管理
  8. MFC 改变控件字体大小
  9. Uncaught (in promise) Error: timeout of 10000ms exceeded---SpringCloud Alibaba_若依微服务框架改造---工作笔记009
  10. Elasticsearch--进阶-bool复合查询---全文检索引擎ElasticSearch工作笔记013