Nativefier 0.1.4

Nativefier 0.1.4

nayanda1 维护。



  • 作者
  • nayanda1

iOSNativefier

iOS 的缓存库


变更日志

查看变更日志请访问 此处


特性

  • 构建器模式
  • 默认缓存图像和任何 HandyJSON 对象 https://github.com/alibaba/HandyJSON
  • 支持同步或异步操作
  • 当对象即将从缓存中删除时使用代理
  • 自定义获取器闭包以在对象未存在于缓存中时获取对象
  • 磁盘和内存上的双缓存

要求

  • Swift 4.2 或更高版本

安装

CocoaPods

pod 'Nativefier', '~> 0.1.3'

或者

pod 'Nativefier'

手动

  1. 克隆此仓库。
  2. 已添加到您的项目中。
  3. 恭喜!

关于Nativefier

nativefier的基本算法非常简单

存储对象

  1. 对象将被异步地存储在内存和磁盘上。
  2. 如果内存已满,将移除访问最少且最旧的对象,为新对象腾出空间。
  3. 如果磁盘已满,将移除访问最少且最旧的对象,为新对象腾出空间。

获取对象

  1. 如果对象已在内存中,将返回存储的对象。
  2. 如果对象不在内存中,将在磁盘上搜索,并将找到的对象存储在内存中作为新对象。
  3. 如果找不到对象,将返回nil。
  4. 如果您使用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