AllCache
Swift 通用缓存
使用 AllCache,您可以在内存和/或磁盘缓存中存储任何实例(如果可以将其表示为 Data
)。
通用缓存
如果您类已经符合 NSCoding
,则可以创建如下缓存
let cache = try! Cache<IceCream>(identifier: "iceCream")
cache.set(IceCream(id: "1", flavor: "Vanilla"), forKey: "1")
let vanilla = try cache.object(forKey: "1")
数据请求器
您也可以从缓存中异步地从一个对象请求并发送一个 fetcher
实例,如果对象在缓存中不存在,则数据请求器将提供它。您可以通过重写 Fetcher
的 fetch(respondIn queue: completion:)
方法并实现父类从那里创建或检索对象。
class IceCreamFetcher: Fetcher<IceCream> {
override func fetch(respondIn queue: DispatchQueue, completion: @escaping (() throws -> FetcherResult<IceCream>) -> Void) -> Request<FetcherResult<IceCream>> {
let request = Request<FetcherResult<IceCream>>(completionHandler: completion)
queue.async {
request.complete(with: FetcherResult<IceCream>(object: IceCream(id: "1", flavor: "Vanilla"), data: nil))
}
return request
}
}
_ = cache.object(forKey: "1", fetcher: IceCreamFetcher(identifier: "1")) { (getIceCream) in
do {
let iceCream = try getIceCream()
} catch {
print(error)
}
}
取消请求
所有异步请求都将返回一个可取消的 Request<T>
对象,您可以添加成功或失败处理程序,或简单地忽略它们
import AsyncRequest
let request = cache.object(forKey: "1", fetcher: IceCreamFetcher(identifier: "1")) { _ in }
request.cancel()
Request<T>
类属于 AsyncRequest 框架,需要单独导入。
处理器
如果需要进一步处理获取到的对象,可以向缓存发送一个 Processor<T>
,您需要在自定义的 Processor
中实现 process(object:respondIn queue:completion:)
方法
class ToppingProcessor: Processor<IceCream> {
override open func process(object: IceCream, respondIn queue: DispatchQueue, completion: @escaping (_ getObject: () throws -> IceCream) -> Void) {
queue.async {
object.topping = "Oreo"
completion({ return object })
}
}
}
然后当您从缓存请求对象时发送一个实例
let fetcher = Fetcher<IceCream>(identifier: "2")
let processor = ToppingProcessor(identifier: "Oreo")
_ = cache.object(forKey: "1", fetcher: fetcher, processor: processor, completion: { _ in })
每个 Processor
对象都有一个 next
属性,因此您可以连接多个处理器
let processor = ToppingProcessor(identifier: "Oreo")
processor.next = ToppingProcessor(identifier: "Chocolate syrup")
图片缓存
AllCache 包含一系列类和扩展,可以简化图像的获取和缓存。将 requestImage(with:placeholder:processor:completion:)
方法添加到了 UIImageView
中,内部使用当前大小从共享的 Cache<UIImage>
实例请求图像,使用 URL
作为键,然后将从缓存中返回的图像设置到 UIImageView
上
let url = URL(string: "https://en.wikipedia.org/wiki/Ice_cream#/media/File:Ice_Cream_dessert_02.jpg")!
_ = imageView.requestImage(with: url)
此外,您还可以向该方法发送一个占位图像、一个处理器或一个完成闭包。
如果获取的图像大小与请求的大小不同,图像将被调整大小以与 UIImageView
的确切大小相匹配,调整大小器只是一个 Processor<T>
子类。如果向参数发送处理器,它将被分配给调整大小器的 next
属性,并将在调整大小后应用,您可以使用这个机制链接多个处理器。
UIButton
也有一个方法来请求图像,区别在于您需要将 UIControlState
发送到参数。