本期推荐的Kingfisher 是一个功能强大的纯 Swift 库,用于从 Web 下载和缓存图像。
Kingfisher它使您有机会在下一个应用程序中使用纯 Swift 方式处理远程图像。
Kingfisher特征
- 异步图像下载和缓存。
- 从URLSession基于网络或本地提供的数据加载图像。
- 提供有用的图像处理器和过滤器。
- 内存和磁盘的多层混合缓存。
- 对缓存行为的精细控制。可定制的到期日期和大小限制。
- 可取消下载和自动重用以前下载的内容以提高性能。
- 独立组件。根据需要分别使用下载器、缓存系统和图像处理器。
- 预取图像并从缓存中显示它们以提升您的应用程序。
- UIImageView, NSImageView, NSButton, UIButton, NSTextAttachment,和的扩展名WKInterfaceImage,用于直接从 URL 设置图像。TVMonogramViewCPListItem
- 设置图像时内置过渡动画。
- 加载图像时可自定义的占位符和指示器。
- 易于扩展的图像处理和图像格式。
- 低数据模式支持。
- SwiftUI 支持。
Kingfisher
import Kingfisher
let url = URL(string: "https://example.com/image.png")
imageView.kf.setImage(with: url)
Kingfisher 将从 下载图像url,将其发送到内存缓存和磁盘缓存,并以imageView. 当您稍后使用相同的 URL 设置它时,图像将从缓存中检索并立即显示。
如果您使用 SwiftUI,它也可以工作:
var body: some View {
KFImage(URL(string: "https://example.com/image.png")!)
}
一个更高级的例子
借助强大的选项,您可以用 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 for: \(value.source.url?.absoluteString ?? "")")
case .failure(let error):
print("Job failed: \(error.localizedDescription)")
}
}
方法链
如果您不是kf扩展的粉丝,您也可以更喜欢使用KF构建器并链接方法调用。下面的代码做同样的事情:
// Use `kf` extension
imageView.kf.setImage(
with: url,
placeholder: placeholderImage,
options: [
.processor(processor),
.loadDiskFileSynchronously,
.cacheOriginalImage,
.transition(.fade(0.25)),
.lowDataMode(.network(lowResolutionURL))
],
progressBlock: { receivedSize, totalSize in
// Progress updated
},
completionHandler: { result in
// Done
}
)
// Use `KF` builder
KF.url(url)
.placeholder(placeholderImage)
.setProcessor(processor)
.loadDiskFileSynchronously()
.cacheMemoryOnly()
.fade(duration: 0.25)
.lowDataModeSource(.network(lowResolutionURL))
.onProgress { receivedSize, totalSize in }
.onSuccess { result in }
.onFailure { error in }
.set(to: imageView)
更好的是,如果以后你想切换到 SwiftUI,只需将KF上面的内容更改为KFImage,你就完成了:
struct ContentView: View {
var body: some View {
KFImage.url(url)
.placeholder(placeholderImage)
.setProcessor(processor)
.loadDiskFileSynchronously()
.cacheMemoryOnly()
.fade(duration: 0.25)
.lowDataModeSource(.network(lowResolutionURL))
.onProgress { receivedSize, totalSize in }
.onSuccess { result in }
.onFailure { error in }
}
}
要求
- iOS 12.0+ / macOS 10.14+ / tvOS 12.0+ / watchOS 5.0+(如果您只使用 UIKit/AppKit)
- iOS 14.0+ / macOS 11.0+ / tvOS 14.0+ / watchOS 7.0+(如果你在 SwiftUI 中使用它)
- Swift 5.0+
安装指南
Swift 包管理器
- 选择文件 > Swift 包 > 添加包依赖项。https://github.com/onevcat/Kingfisher.git在“选择包存储库”对话框中输入。
- 在下一页中,将版本解析规则指定为“Up to Next Major”,最早版本为“7.0.0”。
- 在 Xcode 检查源代码并解析版本后,您可以选择“Kingfisher”库并将其添加到您的应用程序目标中。
Cocoa
CocoaPods是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods
要使用 CocoaPods 将 Kingfisher 集成到您的 Xcode 项目中,请将其指定为您的Podfile:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '12.0'
use_frameworks!
target 'MyApp' do
# your other pod
# ...
pod 'Kingfisher', '~> 7.0'
end
然后,运行以下命令:
$ pod install
从 CocoaPods 安装任何内容后,您应该打开{Project}.xcworkspace而不是打开。{Project}.xcodeproj
Carthage
Carthage是 Cocoa 应用程序的去中心化依赖管理器。要安装 carthage 工具,您可以使用Homebrew。
$ brew update
$ brew install carthage
要使用 Carthage 将 Kingfisher 集成到您的 Xcode 项目中,请在您的Cartfile:
github "onevcat/Kingfisher" ~> 7.0
然后,运行以下命令来构建 Kingfisher 框架:
$ carthage update Kingfisher --platform iOS
# Or `--platform macOS`, `--platform tvOS`, `--platform watchOS`
最后,您需要手动设置您的 Xcode 项目以添加 Kingfisher 框架:
- 在应用程序目标的“常规”设置选项卡上,在“链接框架和库”部分中,从磁盘上的 Carthage/Build 文件夹中拖放要使用的每个框架。
- 在应用程序目标的“Build Phases”设置选项卡上,单击“+”图标并选择“New Run Script Phase”。创建一个包含以下内容的运行脚本:
/usr/local/bin/carthage copy-frameworks
- 在“输入文件”下添加要使用的框架的路径:
$(SRCROOT)/Carthage/Build/iOS/Kingfisher.framework
- 将复制的框架的路径添加到“输出文件”:
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Kingfisher.framework
—END—
开源协议:MIT license