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)

预加载和转场动画

可以在页面展示之前就把图片下载好存进缓存,用户滑到的时候直接从缓存读。设置图片时还支持内置的转场动画效果。

README区域截图

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
  • CocoaPodspod 'Kingfisher', '~> 8.0'
  • 手动集成:从 Release 页面下载 xcframework,拖进项目,设置 Embed Without Signing

5、 适合谁用

所有在做 Apple 平台开发的人。不管项目用 UIKit 还是 SwiftUI,只要有图片加载和缓存需求,Kingfisher 都是主流选择。库本身是 MIT 协议,商用免费。功能模块可以拆开单独用,比如只用下载器或者只用缓存系统。组件之间互相独立,按需组合。

iftUI,只要有图片加载和缓存需求,Kingfisher 都是主流选择。库本身是 MIT 协议,商用免费。功能模块可以拆开单独用,比如只用下载器或者只用缓存系统。组件之间互相独立,按需组合。

更多推荐