NSFetchedResultsController有没有人对缓存实现有任何见解?

时间:2010-12-24 14:57:30

标签: iphone core-data ios4

这是一个奇怪的问题,所以我会从头开始......

我对NSFetchedResultsController(NSFRC)的需求是在获取对象后执行过滤和排序的能力,主要是因为过滤和排序需要自己查询所获取的对象,因此NSFRC无法实现。所以,我编写了自己的类BSFetchedResultsController,它旨在复制NSFRC的功能(委托通知,自动分区和缓存),但为用户添加了一些钩子,用于设置自己的块进行过滤和排序。如果有人想要这个类,那么这个类的代码就在github上:https://github.com/blindingskies/BSFetchedResultsController,虽然我不认为这个类已经准备就绪了,但作为NSFRC的替代品。

所以,我还没有实现缓存,主要是因为我不确定Apple是如何实现缓存的。缓存存储在二进制文件中:

{app dir} /Library/Caches/.CoreDataCaches/SectionInfoCaches/ {cache name} / sectionInfo

因此,据推测,我的课程需要将其缓存存储在类似的位置?这个结构如何组织/工作?缓存需要存储NSFetchPredicate(或重新生成它所需的属性),并且需要以某种方式存档获取的对象。但是,NSManagedObject不符合NSCoding,那么,它如何归档对象?最后,在NSNotificationCenterDidChangeNotification处理程序中,需要更新缓存。

所以,真正的方面是如何存档已获取的对象,我倾向于只将datID保存在数组中?然后从上下文中获取这些对象。够了吗?

如果有人考虑过如何实施

1 个答案:

答案 0 :(得分:1)

好的,为了回答我自己的问题,我已经按如下方式实现了缓存:

创建了另一个类,它保留了NSFetchPredicate的实体(NSEntityDescription),fetch谓词(NSPredicate)和排序描述符(NSArray),以及sectionNameKeyPath和其他BSFetchedResultsController对象(post fetch谓词,过滤器,比较器)。使这个类符合NSCoding。

然后在performFetch:方法的开头,如果有一个缓存名称,取消归档该对象并查看属性是否与BSFRC匹配,如果匹配,则使用缓存的部分数据。

然后向NSManagedObjectContextDidSaveNotification添加另一个通知处理程序,以将对象刷新到缓存。

有几点......我发现直接归档NSFetchRequest(符合NSCoding)并不起作用,目前只检查NSEntityDescription的名称。

另外,我不缓存整个对象图,只是缓存NSManagedObject的NSManangedObjectIDs的URIRepresentation。然后,在验证缓存后给定托管对象上下文重新生成这些URI。

它似乎有用,虽然我不确定我应该多久将对象刷新到缓存...