测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可 | MIT |
发布最新发布 | 2016年12月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Zoltán Matók 维护。
Johnny 是一个用 Swift 3 编写的缓存库。
Storable
协议的对象NSCache
的一级内存缓存额外
func setImageWithURL
,优化单元格重用Johnny.cache(Date(), key: "FirstStart")
// The type of the retrived value must be explicitly stated for the compiler.
let date: Date? = Johnny.pull("FirstStart")
如果您知道您正在检索一个大型对象(> 1.5 MB)
Johnny.pull("4KImage") { (value: UIImage?) in
}
您可以为全局前缀设置,这样在每个调用中都会附加到键参数上,例如根据 userID 缓存数据。
Johnny.prefix = localUser.userID
注意,由于协议使用静态构造函数而不是初始化器,您可以在不访问其源代码的情况下扩展任何类(例如标准库类)而不会出错。
public protocol Storable {
associatedtype Result
static func fromData(data: NSData) -> Result?
func toData() -> NSData
}
您可以缓存任何符合 Storable 协议的项目集合(大多数 Stdlib 数据类型已经符合)。
let array: [String] = ["Folsom", "Prison", "Blues"]
let stringSet: Set<String> = ["I've", "been", "everywhere"]
// In case of dictionaries, the value must explicitly conform to Storable (so [String: AnyObject] does not work, while [String: Double] does)
let dictionary: [String: String] = ["first": "Solitary", "second": "man"]
Johnny.cache(array, key: "folsom")
Johnny.cache(stringSet, key: "everywhere")
Johnny.cache(dictionary, key: "solitary")
由于 Swift 当前限制,由于 Storable 协议有一个 关联类型
,必须通过扩展添加协议一致性。“class User: Storable
” 将不起作用。
class User {
enum Badassery: String { case Total }
var name: String? = "Johnny"
var uid: Int = 84823682
var badassery = Badassery.Total
}
extension User: Storable {
typealias Result = User
static func fromData(data: NSData) -> User.Result? {
let dict = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) as! [NSObject: AnyObject]
let user = User()
user.uid = dict["identification"] as! Int
user.name = dict["name"] as? String
user.badassery = Badassery(rawValue: dict["badassery"] as! String)!
return user
}
func toData() -> NSData {
let json = ["identification": uid, "name": name, "badasery": badassery.rawValue]
return try! NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions())
}
}
使用 Johnny
let johnny: User = User()
Johnny.cache(johnny, key: "John")
let cachedJohn: User = Johnny.pull("John")
CocoaPods
pod 'Johnny'
我想感谢 Pantry 和 Haneke 的创造者,因为那些项目提供了许多灵感和一些代码。Johnny 是两种世界的最佳结合。
Johnny 在 MIT 许可下发布。有关详细信息,请参阅 LICENSE。