iOS - Kingfisher 源码解读


Kingfisher 是一个轻量的下载和缓存网络图片库。下载和缓存是异步进行操作,已经下载好的图片会缓存在内存和本地,极大得提高 app 的体验。值得一提的是,他是我们国内大神王巍开发的一个框架。

一、功能介绍

  • 异步图像下载和缓存。
  • 基于 URLSession 的网络。 提供基本图像处理器和过滤器。
  • 内存和磁盘的多层缓存。
  • 可取消下载和处理任务以提高性能。
  • 独立组件。 根据需要单独使用下载程序或缓存系统。
  • 预览图像并在必要时稍后从缓存中显示它们。
  • UIImageView , NSImage 和 UIButton 扩展可直接从 URL 设置图像。
  • 设置图像时内置过渡动画。
  • 加载图像时可自定义占位符。
  • 可扩展的图像处理和图像格式支持。

二、安装

CocoaPods

在工程内 Podfile 文件中添加:

1
2
3
4
5
6
7
8
9
   source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
# your other pod
# ...
pod 'Kingfisher', '~> 4.0'
end

然后在终端工程目录下执行 pod install 即可。

Carthage

在工程内 Cartfile 文件中添加:

1
github "onevcat/Kingfisher" ~> 4.0

然后执行 carthage update 即可。

三、使用

1.直接设置一张 url 图片

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

使用直接设置的方法,Kingfisher首先会尝试从缓存中去取,如果没有,则直接下载图片并且缓存下来以备后用。此外,Kingfisher默认使用absoluteString of url(即绝对url)作为cacheKey以方便再次加载该图片的时候去缓存中根据cacheKey(也就是图片url)查找,通俗来说就是把图片的整个链接作为cacheKey来缓存在本地。

2.指定一个 cacheKey 缓存图片

1
2
let imageResource = ImageResource(downloadURL: url, cacheKey: "Custom_cache_key")
imageView.kf.setImage(with: imageResource)

3.设置占位符图片

在 Kingfisher 中,为了防止加载网络图片失败,提供了一个设置占位符图片功能,也就是说,当网络加载过程中或者图片加载失败时,就使用自定义的默认图片来代替显示。

1
2
3
if let url = URL(string: "http://mvimg2.meitudata.com/55fe3d94efbc12843.jpg") {
imageView.kf.setImage(with: url, placeholder: placeholder_image, options: nil, progressBlock: nil, completionHandler: nil)
}

4.下载完成回调

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if let url = URL(string: "http://mvimg2.meitudata.com/55fe3d94efbc12843.jpg") {
imageView.kf.setImage(with: url, placeholder: nil, options: nil, progressBlock: nil, completionHandler: { (image, error, cacheType, imageUrl) in

image // 为 nil 时,表示下载失败

error // 为 nil 时,表示下载成功, 非 nil 时,就是下载失败的错误信息

cacheType // 缓存类型,是个枚举,分以下三种:
// .none 图片还没缓存(也就是第一次加载图片的时候)
// .memory 从内存中获取到的缓存图片(第二次及以上加载)
// .disk 从磁盘中获取到的缓存图片(第二次及以上加载)

imageUrl // 所要下载的图片的url

})
}

三、Kingfisher 结构

------本文结束 感谢阅读------

本文地址:http://kaaaaai.cn/articles/iOS-kingfisher-analysis.html
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
转载请注明出处,谢谢!

众筹项目:拯救世界!
0%