Kingfisher源码分析

Kingfisher是一个Swift实现的图片库,涉及图片并发下载、内存管理、缓存策略、格式转换等功能。它采用URLSession进行网络请求,利用NSCache和文件系统实现二级缓存,并使用DispatchQueue确保异步操作。图片下载任务的优先级可通过URLSessionTask设置,退出后台时会清理过期文件。核心代码位于ImageCache.swift和ImageDownloader.swift。通过分析KingfisherManager.shared.retrieveImage,可以了解其获取Image对象的过程。
摘要由CSDN通过智能技术生成

    源码地址: https://github.com/onevcat/Kingfisher

    Kingfisher是iOS圈内有名的王威写的三方库,参考SDWebImage用Swift语言实现。  三方图片库最重要的功能是图片并发下载、内存管理、图片格式转换、异步管理、文件管理等。 看看Kingfisher是怎么做的:

1、 图片下载, Kingfisher对URLSession、URLSessionDelegate进行了封装, 参考URLSession学习笔记

2、 图片缓存, Kingfisher使用二级缓存:内存和文件; 内存是用iOS NSCache实现(参考NSCache内存优化), 文件默认超过7天会删除; 内存和文件存储的图片只可能是PNG、JPEG或GIF这三种数据类型。  

3、图片格式转换,包括Data和Image互转、图片转向、缩放、裁剪、圆形显示等都是iOS系统类实现, 具体在Image.swift实现。

4、文件管理, 使用FileManager遍历文件夹, 比对图片文件创建时间和当前时间之差并删除过期文件。

5、异步管理, 使用DispatchQueue实现异步操作,避免阻塞主线程。 参考GCD多线程详解

6、下载图片任务的优先级, 通过设置URLSessionTask的priority属性实现。

7、在app退出到后台运行时, Kingfisher会自动检测缓存文件总大小是否超过阈值并删除逾期或最远修改的文件;


一张图说明Kingfisher的代码结构:


      其中最重要的就是ImageCache.swift和ImageDownloader.swift,  分别实现下载和缓存功能。


    从Kingfisher用法开始debug跟踪:

let url = URL(string: "url_of_your_image")
imageView.kf.setImage(with: url)

1、  以UIImageView对象为例, 其setImage方法是在UIImageView+Kingfisher.swift里定义的。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值