MapleBacon
简介
MapleBacon 是一个轻量级、快速的 Swift 库,用于下载和缓存图像。
示例
Example
文件夹包含示例项目供您尝试。
要求
- Swift 5.1
- iOS 10.0+
- Xcode 10.2+
安装
MapleBacon可通过CocoaPods获取。安装时将其添加到Podfile中
pod "MapleBacon"
github "JanGorman/MapleBacon"
使用
UIImageView
最基本的使用方法是通过扩展UIImageView
。您可以通过它传递URL
import MapleBacon
private var imageView: UIImageView!
func someFunc() {
let url = URL(string: "…")
imageView.setImage(with: url)
}
如果您想在图片下载期间添加占位符,您可以这样指定
func someFunc() {
let url = URL(string: "…")
imageView.setImage(with: url, placeholder: UIImage(named: "placeholder"))
}
如果您的后端返回的图片未针对显示进行优化,将它们下采样是一种好习惯。MapleBacon通过displayOptions
提供了下采样的支持
func someFunc() {
let url = URL(string: "…")
imageView.setImage(with: url, displayOptions: .downsampled)
}
图像转换器
MapleBacon 允许您对图像进行转换,并缓存结果,这样您的应用程序不需要一次又一次地执行相同的工作。要创建自己的转换器,创建一个遵循 ImageTransforming
协议的类。转换可以是任何您喜欢的,让我们创建一个应用 Core Image 褐色调滤镜的转换器
private class SepiaImageTransformer: ImageTransforming {
// The identifier is used as part of the cache key. Make sure it's something unique
let identifier = "com.schnaub.SepiaImageTransformer"
func transform(image: UIImage) -> UIImage? {
let filter = CIFilter(name: "CISepiaTone")!
let ciImage = CIImage(image: image)
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(0.5, forKey: kCIInputIntensityKey)
let context = CIContext()
guard let outputImage = filter.outputImage,
let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else {
return image
}
// Return the transformed image which will be cached (or used by another transformer)
return UIImage(cgImage: cgImage)
}
}
然后通过便捷方法之一将此滤镜传递给 MapleBacon
let url = URL(string: "…")
let transformer = SepiaImageTransformer()
imageView.setImage(with: url, transformer: transformer)
如果您想对一个图像应用多个转换,您可以连锁转换器
let chainedTransformer = SepiaImageTransformer()
.appending(transformer: DifferentTransformer())
.appending(transformer: AnotherTransformer())
或者,如果您更喜欢,使用自定义的 >>>
操作符
let chainedTransformer = SepiaImageTransformer() >>> DifferentTransformer() >>> AnotherTransformer()
(请注意,如果您正在使用 Core Image,可能会发现连锁单独的转换器并不优化,而是创建一个转换器,在单个过程中应用多个 CIFilter
。请参阅 Core Image 编程指南。)
缓存
MapleBacon 会在内存和磁盘上缓存您的图像。磁盘存储将在一周后自动清理(考虑最后一次访问日期),但您也可以自己控制最大缓存时间
let oneDaySeconds: TimeInterval = 60 * 60 * 24
MapleBacon.default.maxCacheAgeSeconds = oneDaySeconds
合并
在 iOS13 及更高版本上,您可以使用 Combine
从 MapleBacon 获取图像
MapleBacon.shared.image(with: url)
.receive(on: DispatchQueue.main) // Dispatch to the right queue if updating the UI
.sink(receiveValue: { image in
// Do something with your image
})
.store(in: &subscriptions) // Hold on to and dispose your subscriptions
从 5.x 迁移
在维基中有一个小型迁移指南,当您从 5.x 分支迁移到 6.x 时。
许可
MapleBacon遵照MIT许可证发布。更多信息请查看LICENSE文件。