使用 AllCache,你可以将任何实例(如果可以将其表示为 Data
)存储在内存和/或磁盘中。
如果你的类已经遵循 Codable
协议,你可以如下创建一个缓存:
let cache = try! Cache(identifier: "iceCream", serializer: JSONSerializer<Icecream>())
存储或从缓存中获取实例:
cache.set(IceCream(id: "1", flavor: "Vanilla"), forKey: "1")
let vanilla = try cache.instance(forKey: "1")
你也可以从缓存异步请求一个实例,并发送一个 Fetcher
实例。如果对象在缓存中不存在,fetcher 将获取或创建它。你可以遵循 Fetcher
协议并实现 func fetch() -> Promise<FetcherResult<T>>
方法,从那里你可以创建或获取对象。
struct IcecreamCreator: Fetcher {
func fetch() -> Promise<FetcherResult<Icecream>> {
let icecream = Icecream(id: "1", flavor: "Vanilla")
return Promise().fulfill(with: FetcherResult(instance: icecream))
}
}
然后你可以将 fetcher 发送到实例请求。如果实例没有被缓存,IcecreamCreator
将会创建它。
cache.instance(forKey: "1", fetcher: IcecreamCreator()).onSuccess { icecream in
print(icecream.flavor)
}
所有异步请求都返回一个你可以取消、添加成功或错误处理程序的 Promise<T>
对象,或者简单地忽略它们。
import ShallowPromises
let promise = cache.instance(forKey: "1", fetcher: IcecreamCreator()) { _ in }
promise.cancel()
Promise<T>
类属于 ShallowPromises 框架,需要单独导入。
如果你需要进一步处理获取到的实例,你可以将一个 Processor<T>
发送到缓存。你需要在你的自定义 Processor
中实现 process(_ instance: T) throws -> T
方法。
class ToppingProcessor: Processor<Icecream> {
override func process(_ instance: Icecream) throws -> Icecream {
instance.topping = self.identifier
return instance
}
}
然后在你从缓存请求实例时发送一个 processor 实例。
let fetcher = IcecreamCreator()
let processor = ToppingProcessor(identifier: "Oreo")
let promise = cache.instance(forKey: "1", fetcher: fetcher, processor: processor)
每个 Processor
对象都有一个 next
属性,因此你可以链接多个 processor。
let processor = ToppingProcessor(identifier: "Oreo")
processor.next = ToppingProcessor(identifier: "Chocolate syrup")
AllCache 包含了一组类和扩展,使获取和缓存图片变得更容易。requestImage(with:placeholder:processor:)
方法被添加到了 UIImageView
的一个扩展中。在内部,imageView
使用 URL
作为 key,从一个共享的 Cache<UIImage>
实例中请求一个与其当前大小相符的图片。从缓存返回的图像随后被设置到 UIImageView
上。
let url = URL(string: "https://en.wikipedia.org/wiki/Ice_cream#/media/File:Ice_Cream_dessert_02.jpg")!
imageView.requestImage(with: url)
此外,你可以发送一个占位图,或者一个 processor。
如果获取的图片与请求的大小不同,该图片将被调整为与 UIImageView
完全相同的大小。调整器只是一个 Processor<T>
子类。如果你在参数中发送了一个 processor,它将被分配给调整器的 next
属性,并且将在调整大小后应用。你可以使用此机制链接多个 processor。
UIButton
也有一个请求图片的方法,不同之处在于你需要发送一个 UIControlState
作为参数。