iOS开发中或多或少都会使用到Cache来减小网络请求,在网络上也有不少使用Objective-c开发的Cache框架,而Swift开发的Cache框架相对来讲就要少一些,SwiftlyCache是我开发的一个Cache框架(github.com/hlc0000/Swi…)git
Codable
协议的数据类型LRU
淘汰算法Subscript
,使读写数据更加方便MultiCacheGennerator
、MemoryCacheGenerator
、DiskCacheGenerator
用于支持for..in
、 compactMap
、map
、filter等方法CacheAware:提供了一些基本接口的协议,MultiCache,MemoryCache,DiskCache等都遵照该协议. MultiCache:多重缓存,调用MemoryCache以及DiskCache相关方法. MemoryCache:负责处理容量小,相对高速的内存缓存,线程安全,支持异步操做,支持自动和手动清理缓存功能. MemoryStorage:MemoryCache使用的双向链表类. LinkedNode:双向链表节点类. DiskCache:负责处理容量大,相对低速的磁盘缓存,线程安全,支持异步操做,自动和手动清理缓存功能. DiskStorage:DiskCache内部实现类. DiskStorageItem:用于加载磁盘缓存数据使用的. SwiftlyCache支持使用Subscript,读写更加方便. SwiftlyCache提供了MultiCacheGenerator、MemoryCacheGenerator、DiskCacheGenerator用于支持for ... in、compactMap、 map、filter等一系列方法复制代码
1.在Podfile中添加pod 'SwiftlyCache'
2.执行pod install
或者pod update
3.导入 SwiftlyCache
github
1.下载SwiftlyCache
文件夹内全部内容
2.将SwiftlyCache
内的源文件添加到你的工程算法
设置最大的内存缓存容量(0为不限制)数据库
public var totalCostLimit:vm_size_t = 0复制代码
设置最大的内存缓存数量api
public var totalCountLimit:vm_size_t = 0复制代码
系统内存警告是否删除全部内存数据,默认为true缓存
public var autoRemoveAllObjectWhenMemoryWarning = true复制代码
进入后台是否删除全部内存数据,默认为true安全
public var autoRemoveAllObjectWhenEnterBackground = true复制代码
设置最大的磁盘缓存容量(0为不限制)bash
public var maxSize:vm_size_t = 0复制代码
设置最大的磁盘缓存数量markdown
public var maxCountLimit:vm_size_t = 0复制代码
缓存的过时时间(默认是一周)网络
public var maxCachePeriodInSecond:TimeInterval = 60 * 60 * 24 * 7复制代码
自动检查时间设置(默认为120秒)
自动检查磁盘缓存是否达到限制,若是达到限制,则自动丢弃部分数据(缓存最大容量限制、缓存最大个数限制、数据是否过时)
public var autoInterval:TimeInterval = 120复制代码
MultiCache和MemoryCache
,DiskCache
中的设置缓存、获取缓存、根据key查询是否存在对应的缓存数据、移除所有缓存数据、根据key移除对应的缓存数据都是遵照CacheAware
协议的
设置缓存对象:(Value
为全部遵照Codable
协议的数据类型)
public func set(forKey key: String, value: Value?, cost: vm_size_t = 0)->Bool public func set(forKey key:String,value:Value?,cost:vm_size_t = 0,completionHandler:@escaping((_ key:String,_ finished:Bool) -> Void)) 复制代码
能够经过Subscript
的形势设置缓存key、Value
cache["key"] = Value复制代码
获取缓存对象
public func object(forKey key: String) -> Value? public func object(forKey key:String,completionHandler:@escaping((_ key:String,_ value:Value?) -> Void))复制代码
也能够经过Subscript
的方式获取对应的缓存对象
let object = cache["key"]复制代码
根据给定的key
查找缓存中是否存在对应的Value
public func isExistsObjectForKey(forKey key: String) -> Bool public func isExistsObjectForKey(forKey key:String,completionHandler:@escaping((_ key:String,_ contain:Bool) -> Void))复制代码
根据key
移除缓存中对应的value
public func removeObject(forKey key: String) public func removeObject(forKey key: String, completionHandler: @escaping (() -> Void))复制代码
移除全部缓存
public func removeAll()
public func removeAll(completionHandler:@escaping(() -> Void)复制代码
也能够经过for ... in
、compactMap
、 map
、filter
等方式获取到对应的缓存数据
public func makeIterator() -> MultiCacheGenerator<Value> let iterator = cache.makeIterator() while let result = iterator.next(){ } let flatMapResult = cache.compactMap{ $0 } print("flatMapResult:\(flatMapResult)") let filterResult = cache.filter{(key,object) -> Bool in return key == "shirley2"} print("filterResult:\(filterResult)") cache.forEach( print($0) ) let values = cache.map{ return $0 } print("value:\(value)") for (key,object) in cache{ print("key:\(key),object:\(object)") }复制代码
MultiCache
与MemoryCache
全部的可供使用的接口就介绍完了,DiskCache
除了上述全部接口以外还有如下几个:
移除全部过时数据
public func removeAllExpired()->Bool{}复制代码
获取磁盘缓存总个数
public func getTotalItemCount()->Int}
public func getTotalItemCount(completionHandler:@escaping((_ count:Int)->Void)){}复制代码
获取磁盘缓存总占用容量
public func getTotalItemSize()->Int32{}
public func getTotalItemSize(completionHandler:@escaping((_ size:Int32)->Void)){}复制代码
以前也看过一些用Objective-c开发的Cache框架,好比PINCache
,YYCache
等,也基本了解了他们的一些优缺点,因此在SwiftlyCache
中也尽可能融合了他们的一些优势.
单线程下的MemoryCache
性能测试(150000次)
PINMemoryCache
写入数据时采用三个字典的方式分别记录缓存对象、缓存时间、缓存容量,在每次写入数据时都须要依次对三个字典进行写入操做.
YYMemoryCache
和SwiftlyCache
在每次写入数据的时候最多只须要对字典进行一次写入操做.
在每次缓存数据完成以后,都须要丢弃超出TotalCount
和TotalCost
的数据,PINMemoryCache
在淘汰时都须要对Date
字典从新进行排序,而后再丢弃掉最老的数据.
而YYCache
和SwiftlyCache
则须要每次从链表的最后开始移除,YYCache
的cost
淘汰是异步线程中进行的,而SwiftlyCache
则是在当前线程中进行(每一次设置缓存数据完成后都会对TotalCost
进行判断,可丢弃数据不多,若是使用异步线程的开销蛮大的).
单线程下的DiskCache
性能测试(1000次,左侧数据为10k,右侧数据为100k)
PINDiskCache
使用文件缓存数据,设置文件参数,文件的大小来管理缓存数据,对缓存数据的增删改查也是转化为对文件的读写删除操做.
YYDiskCache
和SwiftlyCache
中DiskCache
都是使用SQLite
和文件结合的方式进行数据缓存,能够更好得扩展元数据,实现LRU淘汰算法,当缓存数据超过20k,将元数据写入数据库,value
写在文件中.
终于完成了最终版本的发布了,我终于能够去放肆的抽上一根烟了,哈哈哈,也但愿各位小伙伴多多提出宝贵意见和建议....谢谢啦啦啦啦啦啦.......