YYCache icon indicating copy to clipboard operation
YYCache copied to clipboard

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

Open 1257331501 opened this issue 9 years ago • 9 comments

1257331501 avatar Apr 21 '16 12:04 1257331501

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

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

ibireme avatar Apr 21 '16 13:04 ibireme

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

1257331501 avatar Apr 21 '16 13:04 1257331501

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

1257331501 avatar Apr 21 '16 13:04 1257331501

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

ibireme avatar Apr 21 '16 16:04 ibireme

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

903669695 avatar Oct 10 '17 13:10 903669695

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

pengxuyuan avatar Mar 13 '18 06:03 pengxuyuan

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

xx-li avatar Mar 22 '18 02:03 xx-li

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

903669695 avatar Jul 31 '23 03:07 903669695

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

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

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

coooliang avatar Jul 31 '23 06:07 coooliang