idS*_*tar 7 core-data prefetch relationship fault ios5
我有几个关于Core Data行为的"理论"问题,这些问题与to-many关系中发生的事情有关,何时依赖于从父实体中走出关系以及何时应该构建一个新的获取请求.他们都非常相关.
假设父实体RPBook与其具有多对多关系RPChapter.一本书有很多章节.逆也在核心数据模型中设置.涉及手动排序关系的基本形式,因此RPChapter实体具有chapterIndex属性.我没有在这里使用iOS5的新订购关系(与这些问题无关).
要进入书中的章节,可以使用chapters关系访问者:
RPBook *myBook; // Assume this is already set to an existing RPBook
NSSet *myChapters = myBook.chapters
Run Code Online (Sandbox Code Playgroud)
在iPhone应用程序中,我们从一个显示RPBook实例列表的表视图开始.相应的章节不会被预取作为支持表视图的获取结果控制器的获取规范的一部分,因为这些章节尚不需要.
我现在选择其中一个RPBook实例,我被带到一个新页面,我RPBook在我的视图控制器中有这个实例引用,它没有chapters预取.
filteredSetUsingPredicate:的chapters关系的时候了如果我想通过直接chapters使用关系进行过滤filteredSetUsingPredicate:,那么即使工作也可靠,因为我没有预先获取RPChapter当前RPBook正在查看的当前所有相关实例?换句话说,filteredSetUsingPredicate:在该关系中的所有对象的幕后触发故障,以便做它的事情,或者它会误导性地仅根据已经碰巧在内存中的哪些章节(如果有的话)给出结果?
如果我没有相当多的相关章节,我应该allObjects先通过调用来设置这个样式吗?即
[[self.chapters allObjects] filteredArrayUsingPredicate:predicate]
Run Code Online (Sandbox Code Playgroud)
而不只是:
[self.chapters filteredSetUsingPredicate:predicate]
Run Code Online (Sandbox Code Playgroud)
在我有一个RPBook实例但没有RPChapter与之相关的预取实例的情况下,如何使用关系强制一次性获取所有书籍的章节chapters?是否[myBook.chapters allObjects]做到这一点还是我仍然可以得到故障从回调?
我想核心数据履行了一批,而不是为奇跳闸故障所有故障RPChapter问这是否会影响使用的行为filteredSetUsingPredicate:上chapters的关系,按照上述问题1.
我是否必须使用显式提取请求来执行此操作?我应该重新获取RPBook我已经拥有的,但是这一次,在获取请求中请求所有相关的章节也可以使用setRelationshipKeyPathsForPrefetching:?
最后一种选择似乎只是浪费我的,B/C我已经有较概念所有的子集的范围关系RPChapter情况下,我会感兴趣的.尽可能多的,我想只是走的对象图.
设置
在这种情况下,我有一个RPBook实例,但没有RPChapter与之相关的预取实例(但它们确实存在于Store中).在同一个视图控制器中,我还有一个范围限定在同一本书中NSFetchedResultsController (FRC)的RPChapter实例.这是相同的线程,相同的托管对象上下文.
是RPChapter打算从FRC实例在内存中为同一个对象RPChapter实例对应我从检索myBook.chapters,共享相同ObjectID?换句话说,运行时是否曾ObjectID使用内存中的不同物理对象从同一个线程中的同一个MOC 完成相同的托管对象请求?
NSFetchedResultsController在托管对象内部安装设计模式以提供关系查询我正在尝试通过使用chapters我的自定义RPChapter托管对象子类中提供的内置关系来决定是否应该能够通过使用我的自定义托管对象子类中提供的内置关系来提供有关内容经常更改的关系的查询(在我的示例中的书中的章节),或者它是否可以使用从设计/结构的角度来看,以安装FRC的RPChapter实例到所述RPBook管理对象类,有效地服务有关在这本书的章节的查询.
这显然是更清洁,如果我可以只依靠chapters在访问myBook实例,但它似乎在FRC这里实际上可能会在在一对多关系的大体积的目的实体的存在的情况下更好的性能和效率.
这是否过度,或者这是否以合理的方式FRC用于RPBook以不同的方式查询其章节?不知怎的,感觉我错过了简单地走对象图的机会.我希望能够信任的chapters关系始终是当我加载我的最新RPBook实例.
Mar*_*rra 10
是的,它会奏效.当您调用[book chapters]set时,将自动填充.当您对这些对象进行过滤时,它们将会出错.
但是,您应该在NSFetchedResultsController这里使用谓词类似@"book ==%@"而不是抓取数组.
强制NSManagedObjectContext加载所有章节的最佳方法是执行a NSFetchRequest并配置NSFetchRequest以返回完全实现的对象而不是故障.这将一次性预加载它们.但是,除非你有一章TON,否则你不会在这里节省很多钱.
为什么?
因为当您请求这些章节时,即使在出现故障状态时,Core Data也会将数据加载到缓存中(不包括像二进制数据这样的一些边缘情况),这样当您对某个对象"出错"时,它就是指针移动内存并没有额外的磁盘命中.
您可能需要数千章才能看到预取的任何好处.
是.它们将是同一个对象. NSManagedObject从同一个实例中检索实例时,将始终共享实例NSManagedObjectContext.这是该工作的一部分NSManagedObjectContext
你想使用NSFetchedResultsControler它的工作.手动管理这些东西是浪费的,几乎可以保证比Core Data的实现效率低.
但是,除非您从另一个线程调整它,否则该关系将始终是最新的.因此,如果您不希望更新,那么您可以使用数组.我不会.
| 归档时间: |
|
| 查看次数: |
2951 次 |
| 最近记录: |