Johnny 2.0

Johnny 2.0

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最新发布2016年12月
SwiftSwift 版本3.0
SPM支持 SPM

Zoltán Matók 维护。



Johnny 2.0

  • 作者:
  • Zoltán Matók

Logo

pod platform license

Johnny 是一个用 Swift 3 编写的缓存库。

特性

  • [x] 支持以下类型的泛型缓存:
    • String, Bool, Int, UInt, Int64, UInt64, Float, Double
    • URL, Data, Date
    • UIImage, UIColor
    • 以上类型数组的、字典和集合
    • 可选
    • Any 类型的符合 Storable 协议的对象

  • [x] 多平台,支持 iOS,macOS,tvOS 和 watchOS
  • [x] 使用 NSCache 的一级内存缓存
  • [x] 二级 LRU 磁盘缓存
  • [x] 在后台线程中进行磁盘访问(保存时总是,获取时可选)
  • [x] 同步和异步 API 支持
  • [x] 在内存警告和磁盘容量不足时自动清除缓存
  • [x] 单元测试
  • [x] 简洁、结构良好的代码以鼓励贡献

额外❤️图像

  • [x] 在 UIImageView, UIButton 和 NSImageView 上扩展 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

示例

Storable

注意,由于协议使用静态构造函数而不是初始化器,您可以在不访问其源代码的情况下扩展任何类(例如标准库类)而不会出错。

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")

要求

  • iOS 8.0+
  • macOS 10.10+
  • tvOS 9.0+
  • watchOS 2.0+
  • Swift 2.0+(还有一个 swift3 分支)

安装

CocoaPods

pod 'Johnny'

归属

我想感谢 PantryHaneke 的创造者,因为那些项目提供了许多灵感和一些代码。Johnny 是两种世界的最佳结合。

许可

Johnny 在 MIT 许可下发布。有关详细信息,请参阅 LICENSE。