MapleBacon 是一个轻量级且快速的 Swift 库,用于下载和缓存图像。
Example
文件夹包含示例项目,供您试用。
MapleBacon 可以通过 CocoaPods 安装。 要安装,请将其添加到您的 Podfile
pod "MapleBacon"
github "JanGorman/MapleBacon"
最基本的使用是通过 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 Programming Guide。)
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 分支迁移到 6.x 时,wiki 中有一个小的迁移指南
MapleBacon 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件。