灵感来自 YYCache.
如果你正在使用 Cocoapods
pod "KMCache"
使用 CFMutableDictinaryRef
作为快速搜索的容器。创建 _cache_node
和 _cache_linked_list
来建立有序数据所需的链表。_cache_node
是一个具有 key
、value
、timestamp
、size
属性,并且有 _prev
和 _next
指针的节点。它存储对象和其他信息。_cache_linked_list
是按插入时间排序的,并且在节点再次使用时刷新节点。
将其视为一个队列,每次你想将一个对象添加到缓存中,首先创建一个节点,并将其添加到队列的尾部。当添加一个节点时,会执行以下两个操作:1. 将节点添加到字典中。2. 将节点的前指针设置为队列的尾部,节点成为新的尾部。
搜索是从字典中获取值。
KMCache 提供两种释放类型,按时间和按大小释放。节点信息包含 time
属性,当缓存自动清理时,会检查此属性。
KMCache 会自动计算字典数据的大小,但这实际上非常耗时。想想看,每次我们将一个节点添加到列表中,我们必须将字典转换为 NSData
并计算它。更糟糕的是,如果字典的大小太大,我们不知道应该释放多少个节点。所以我放弃了。
最终,在 YYCache
和 NSCache
的注释的帮助下,更好的方法是设置一个 _cache_node
的属性来记录节点的大小。但大小不是自动生成的,它是由用户设置的。
自动清理每5秒钟运行一次(默认),我在 KMCache 中设置了一个 NSTimer
。计时器被添加到主运行循环中,所以如果主线程正在执行同步操作,计时器也会停止。