75 lines
2.0 KiB
Swift
75 lines
2.0 KiB
Swift
|
//
|
||
|
// ImageDataCache.swift
|
||
|
// Tusker
|
||
|
//
|
||
|
// Created by Shadowfacts on 1/16/21.
|
||
|
// Copyright © 2021 Shadowfacts. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import UIKit
|
||
|
import Cache
|
||
|
|
||
|
class ImageDataCache {
|
||
|
|
||
|
private let memory: MemoryStorage<(Data, UIImage)>
|
||
|
private let disk: DiskStorage<Data>?
|
||
|
|
||
|
init(name: String, memoryExpiry: Expiry, diskExpiry: Expiry?) {
|
||
|
let memoryConfig = MemoryConfig(expiry: memoryExpiry)
|
||
|
self.memory = MemoryStorage(config: memoryConfig)
|
||
|
|
||
|
if let diskExpiry = diskExpiry {
|
||
|
let diskConfig = DiskConfig(name: name, expiry: diskExpiry)
|
||
|
self.disk = try! DiskStorage(config: diskConfig, transformer: TransformerFactory.forData())
|
||
|
} else {
|
||
|
self.disk = nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func has(_ key: String) throws -> Bool {
|
||
|
if try memory.existsObject(forKey: key) {
|
||
|
return true
|
||
|
} else if let disk = self.disk,
|
||
|
try disk.existsObject(forKey: key) {
|
||
|
return true
|
||
|
} else {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func get(_ key: String) throws -> (Data, UIImage)? {
|
||
|
if try memory.existsObject(forKey: key) {
|
||
|
return try! memory.object(forKey: key)
|
||
|
} else if let disk = self.disk,
|
||
|
try disk.existsObject(forKey: key),
|
||
|
let data = try? disk.object(forKey: key),
|
||
|
let image = UIImage(data: data) {
|
||
|
return (data, image)
|
||
|
} else {
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func getImage(_ key: String) throws -> UIImage? {
|
||
|
return try get(key)?.1
|
||
|
}
|
||
|
|
||
|
func getData(_ key: String) throws -> Data? {
|
||
|
return try get(key)?.0
|
||
|
}
|
||
|
|
||
|
func set(_ key: String, data: Data, image: UIImage) throws {
|
||
|
memory.setObject((data, image), forKey: key)
|
||
|
|
||
|
if let disk = self.disk {
|
||
|
try disk.setObject(data, forKey: key)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func removeAll() throws {
|
||
|
memory.removeAll()
|
||
|
try? disk?.removeAll()
|
||
|
}
|
||
|
|
||
|
}
|