MapleBacon 6.2.1

MapleBacon 6.2.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2023年8月
SPM支持 SPM

Jan GormanRamy Kfoury 维护。



MapleBacon

CI codecov.io Version License Platform Carthage compatible SPM

简介

MapleBacon 是一个轻量级、快速的 Swift 库,用于下载和缓存图像。

示例

Example 文件夹包含示例项目供您尝试。

要求

  • Swift 5.1
  • iOS 10.0+
  • Xcode 10.2+

安装

MapleBacon可通过CocoaPods获取。安装时将其添加到Podfile中

pod "MapleBacon"

Carthage

github "JanGorman/MapleBacon"

以及Swift Package Manager

使用

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文件。