iOSNativefier
iOS 的缓存库
变更日志
查看变更日志请访问 此处
特性
- 构建器模式
- 默认缓存图像和任何 HandyJSON 对象 https://github.com/alibaba/HandyJSON
- 支持同步或异步操作
- 当对象即将从缓存中删除时使用代理
- 自定义获取器闭包以在对象未存在于缓存中时获取对象
- 磁盘和内存上的双缓存
要求
- Swift 4.2 或更高版本
安装
CocoaPods
pod 'Nativefier', '~> 0.1.3'
或者
pod 'Nativefier'
手动
- 克隆此仓库。
- 已添加到您的项目中。
- 恭喜!
关于Nativefier
nativefier的基本算法非常简单
存储对象
- 对象将被异步地存储在内存和磁盘上。
- 如果内存已满,将移除访问最少且最旧的对象,为新对象腾出空间。
- 如果磁盘已满,将移除访问最少且最旧的对象,为新对象腾出空间。
获取对象
- 如果对象已在内存中,将返回存储的对象。
- 如果对象不在内存中,将在磁盘上搜索,并将找到的对象存储在内存中作为新对象。
- 如果找不到对象,将返回nil。
- 如果您使用getOrFetch方法,则在任何地方找不到对象时,将使用您的自定义fetcher检索对象,并将从fetcher存储的对象作为新对象存储到内存和磁盘。
使用示例
HandyJSON和图片
使用NativefierBuilder构建对象
- containerName是磁盘中缓存文件夹的名称
- maxRamCount是内存中可以存储的对象的最大数量
- maxDiskCount是磁盘上可以存储的对象的最大数量
//HandyJSON object cache
let handyJSONCache = NativefierBuilder.getForHandyJSON<MyObject>().set(containerName: "myobject").set(maxRamCount: 100).set(maxDiskCount: 200).build()
//Image cache
let imageCache = NativefierBuilder.getForImage().set(maxRamCount: 100).set(maxDiskCount: 200).build()
任意对象
如果您需要自定义对象,可以为您的缓存创建自己的序列化器
class MyOwnSerializer : NativefierSerializerProtocol{
func serialize(obj : AnyObject) -> Data? {
guard let myObject : MyObject = obj as? MyObject else {
return nil
}
//ANY CODE TO CONVERT YOUR OBJECT TO DATA
return serializedData
}
func deserialize(data : Data) -> AnyObject? {
//ANY CODE TO CONVERT DATA TO YOUR OBJECT
return deserializedObject
}
}
然后创建您的缓存
let myObjectCache = NativefierBuilder.getForAnyObject<MyObject>().set(containerName: "myobject").set(maxRamCount: 100).set(maxDiskCount: 200).set(serializer: MyOwnSerializer()).build()
创建fetcher
如果想要获取的对象不在内存或磁盘上,将执行fetcher。从fetcher返回的对象将被存储在缓存中
let myObjectCache = NativefierBuilder.getForAnyObject<MyObject>().set(containerName: "myobject").set(maxRamCount: 100).set(maxDiskCount: 200).set(serializer: MyOwnSerializer())
.set(fetcher: { key in
//ANY CODE TO FETCH THE OBJECT USING THE GIVEN KEY
return fetchedObject
}).build()
如果fetch返回nil,则认为fetch失败,您可以在构建器或对象失败时让nativefier自动重试
let myObjectCache = NativefierBuilder.getForAnyObject<MyObject>().set(containerName: "myobject").set(maxRamCount: 100).set(maxDiskCount: 200).set(serializer: MyOwnSerializer())
.set(fetcher: { key in
//ANY CODE TO FETCH THE OBJECT USING THE GIVEN KEY
return fetchedObject
})
.set(maxRetryCount: 3) //RETRY 3 TIMES
.build()
myObjectCache.maxRetryCount = 5 //RETRY 5 TIMES
使用Nativefier
使用nativefier非常简单。就像使用Dictionary对象一样使用它。但请记住,如果您想使用fetcher,最好异步执行它,这样就不会因为fetch时间过长而阻塞您的执行
let object = myCache["myKey"]
myCache["newKey"] = myNewObject
//Using fetcher if its not found anywhere
let fetchedObject = myCache.getOrFetch(forKey : "myKey")
//Using async, it will automatically using fetcher if the object is not found anywhere and you have fetcher.
myCache.asyncGet(forKey: "myKey", onComplete: { object in
guad let object : MyObject = object as? MyObject else {
return
}
//DO SOMETHING WITH YOUR OBJECT
})
使用代理
如果您需要使用代理,您需要实现代理并将其放入您的缓存中,这样缓存就会执行它。您可以使用的代理方法有
- nativefier(_ nativefier : Any , onFailedFecthFor key: String) -> Any?
此方法将在获取对象失败时执行,您可以返回任何默认对象,它将不会存储在缓存中
- nativefier(_ nativefier : Any, memoryWillRemove singleObject: Any)
此方法将在nativefier将要从内存中移除一些对象时执行
- nativefierWillClearMemory(_ nativefier : Any)
此方法将在nativefier将要清除内存时执行
- nativefier(_ nativefier : Any, diskWillRemove singleObject: Any)
此方法将在nativefier将要从磁盘上移除一些对象时执行
- nativefierWillClearDisk(_ nativefier : Any)
此方法将在nativefier将要清除磁盘时执行
所有方法都是可选的,使用您需要的那些
// on build
let imageCache = NativefierBuilder.getForImage().set(maxRamCount: 100).set(maxDiskCount: 200).set(delegate : self).build()
// or directly to the Nativefier Object
imageCache.delegate = self
贡献
我们非常欢迎对 iOSNativefier 的贡献,只需联系我至 [邮箱地址 或直接发起pull request