MapleBacon

CI codecov.io Version License Platform Carthage compatible SPM

简介

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

示例

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

要求

安装

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 Programming Guide。)

缓存

MapleBacon 会将您的图像缓存在内存和磁盘上。 磁盘存储会在一周后自动删除(同时考虑上次访问日期),但您也可以自己控制最大缓存时间

let oneDaySeconds: TimeInterval = 60 * 60 * 24
MapleBacon.default.maxCacheAgeSeconds = oneDaySeconds

Combine

在 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 时,wiki 中有一个小的迁移指南

许可证

MapleBacon 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件。