Kingfisher:Swift 开发者的图片加载工具
Kingfisher:Swift 开发者的图片加载工具
Kingfisher 在 GitHub 上拿到超过 24000 颗星。
这是一个纯 Swift 写的图片下载和缓存库,专门为 iOS、macOS、tvOS、watchOS 和 visionOS 设计。做的事情很简单:从网上拉图片,存到本地,下次直接用缓存,不用再请求网络。

1、 这个库解决什么问题
做过 iOS 开发的人都知道,图片加载这件事看着简单,做好不容易。
下载要异步处理,不能卡主线程。缓存要分内存和磁盘两层,内存快但容量小,磁盘容量大但读写慢。图片要支持裁剪、圆角、缩放等处理。不同页面用到同一张图,要能复用已下载的内容。网络慢的时候还得给用户看个占位图。
这些 Kingfisher 全包了。一行代码搞定最基本的图片加载:
imageView.kf.setImage(with: url)
设置完 URL,它自动下载、自动缓存、自动显示。下次用同样的 URL,直接从缓存里取,秒出。
2、 核心能力
缓存机制
Kingfisher 用的是内存加磁盘的混合缓存。内存缓存读写快,适合刚用过的图;磁盘缓存持久化存储,App 重启后还能用。缓存的过期时间和大小上限都可以自定义控制。
图片处理器
下载完的图片不是直接显示,而是可以经过一系列处理器:降采样、圆角、滤镜,处理器可以链式组合。降采样按目标尺寸缩小图片,减少内存占用,这在列表页加载大图时很关键。
SwiftUI 支持
UIKit 用 kf 扩展,SwiftUI 用 KFImage,写法几乎一样。从 UIKit 迁移到 SwiftUI,改一个词就行:
// UIKit
imageView.kf.setImage(with: url)
// SwiftUI
KFImage(url)
预加载和转场动画
可以在页面展示之前就把图片下载好存进缓存,用户滑到的时候直接从缓存读。设置图片时还支持内置的转场动画效果。

3、 一个稍复杂的例子
实际开发中,你可能需要同时做降采样、圆角、占位图、加载动画、结果回调。Kingfisher 的写法:
let url = URL(string: "https://example.com/high_resolution_image.png")
let processor = DownsamplingImageProcessor(size: imageView.bounds.size)
|> RoundCornerImageProcessor(cornerRadius: 20)
imageView.kf.indicatorType = .activity
imageView.kf.setImage(
with: url,
placeholder: UIImage(named: "placeholderImage"),
options: [
.processor(processor),
.scaleFactor(UIScreen.main.scale),
.transition(.fade(1)),
.cacheOriginalImage
])
{
result in
switch result {
case .success(let value):
print("Task done: \(value.source.url?.absoluteString ?? "")")
case .failure(let error):
print("Job failed: \(error.localizedDescription)")
}
}
降采样到目标尺寸、裁圆角、加载时显示转场动画、缓存原图、完成后回调。这些功能组合在一起,代码量也不多。
如果不喜欢 kf 扩展的写法,还可以用 KF builder 做链式调用,风格更接近声明式。UIKit 和 SwiftUI 都支持这套写法。
4、 平台和安装
支持的最低版本:iOS 13.0+、macOS 10.15+、tvOS 13.0+、watchOS 6.0+、visionOS 1.0+。SwiftUI 部分要求 iOS 14.0+。当前最新大版本是 8.0,要求 Swift 5.9 以上。
安装方式三种:
- Swift Package Manager:Xcode 里直接加依赖,指向仓库地址,选 Up to Next Major
- CocoaPods:
pod 'Kingfisher', '~> 8.0' - 手动集成:从 Release 页面下载 xcframework,拖进项目,设置 Embed Without Signing
5、 适合谁用
所有在做 Apple 平台开发的人。不管项目用 UIKit 还是 SwiftUI,只要有图片加载和缓存需求,Kingfisher 都是主流选择。库本身是 MIT 协议,商用免费。功能模块可以拆开单独用,比如只用下载器或者只用缓存系统。组件之间互相独立,按需组合。
iftUI,只要有图片加载和缓存需求,Kingfisher 都是主流选择。库本身是 MIT 协议,商用免费。功能模块可以拆开单独用,比如只用下载器或者只用缓存系统。组件之间互相独立,按需组合。
更多推荐



所有评论(0)