ibireme / YYCache

High performance cache framework for iOS.
MIT License
2.38k stars 511 forks source link

用setObjeck:forKey: 多次存一个类型的对象,怎么可以一次获取所有的allValues?? #44

Open 1257331501 opened 8 years ago

ibireme commented 8 years ago

目前没有提供这个接口。。对于内存缓存来说,提供这个接口需要对内部 dictionary 进行 copy,这会阻塞其他访问线程;对于磁盘缓存来说,这可能会把所有文件读取到内存,可能会造成内存过高甚至崩溃。

什么场景下会需要这个接口?

1257331501 commented 8 years ago

场景:我要缓存一个好友关系列表,用YYCache 存整个好友list,很多时候需要或者缓存的好友list, 程序中对两个人是不是好友的判断也比较频繁,每次都是用一个好友ID,去缓存中遍历整个list,检查缓存list中,是否有包含此id的好友,来确定彼此是否是好友关系。 他们建议我不要缓存整个好友list,要一次缓存一个好友,这样就便于查找了,如此一来获取整个list就麻烦了。

1257331501 commented 8 years ago

是不是这样情况下,就不能使用YYCache了,而用NSCache的话,会定期清理缓存,这样以来 就不符合应用场景了。 用一个自定义字典自己写内存和磁盘缓存,如果自定义字典的话(还有管理线程安全),是不是很麻烦了?求解,PS:好友变更关系是比较频繁的。

ibireme commented 8 years ago

Cache 数据本身就是是容易丢失的,不太适合这种场景。。

903669695 commented 7 years ago

对于这种类似好友列表的场景就没办法用YY了嘛,只能FMDB?

pengxuyuan commented 6 years ago

你好,看你这个问题,想一次性获取缓存所有的 allValues,我觉得可以在 NSCache 中或者 YYCache 中添加一个类似字典的,维持引用,这里可以用 NSMapTable,这样子就不会影响保存对象的引用计数,然后就可以增加方法获取到所有的缓存对象了,具体可以参考下 SDWebImage 中 SDImageCache 中的 SDMemoryCache 的设计。但是要注意多线程问题,为临界区加锁。

xx-li commented 6 years ago

可以考虑添加一个遍历全部值的接口。 因为有要对整个数据进行遍历处理的需求。

903669695 commented 1 year ago

您好,您发来的邮件已收到

coooliang commented 1 year ago

目前没有提供这个接口。。对于内存缓存来说,提供这个接口需要对内部 dictionary 进行 copy,这会阻塞其他访问线程;对于磁盘缓存来说,这可能会把所有文件读取到内存,可能会造成内存过高甚至崩溃。

什么场景下会需要这个接口?

  1. 当更换框架时,需要获取所有数据并复制过到新框架;
  2. 更换Cache目录为Document目录,因为Cache目录中数据常会丢失