所有缓存 3.5.0

AllCache 3.5.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2020年4月
SPM支持 SPM

Juanjo Arreola 维护。



 
依赖项
Logg~> 2.1.0
AsyncRequest~> 2.2.0
 

AllCache 3.5.0

  • 作者
  • Juanjo Arreola

AllCache

Cocoapods Platform License codebeat badge

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 实例,如果对象在缓存中不存在,则数据请求器将提供它。您可以通过重写 Fetcherfetch(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 发送到参数。