这是一个非常具体的问题,我刚刚被它所困扰,所以为了节省其他人的时间和痛苦,这是我的问题深入和解决方案。
例如,当您保存主上下文并触发 NSFetchedResultsController 委托回调时,您能否依赖于您的保存已实际完成这一事实,并且您是否可以在这些回调中安全地执行新的获取请求,假设当前保存的数据将被包括在内?
答案是不。
这是一个非常具体的问题,我刚刚被它所困扰,所以为了节省其他人的时间和痛苦,这是我的问题深入和解决方案。
例如,当您保存主上下文并触发 NSFetchedResultsController 委托回调时,您能否依赖于您的保存已实际完成这一事实,并且您是否可以在这些回调中安全地执行新的获取请求,假设当前保存的数据将被包括在内?
答案是不。
如果您的应用程序中有活动的 NSFetchedResultsController (NSFRC) 并具有委托集并正在监视对相关对象的更改,那么这里有一个未记录的小警告,所有 Core Data 开发人员都应该注意。如果您在主上下文上执行保存,并让 NSFRC 在主上下文上工作,那么调用save:
主上下文实际上将首先更新 NSFRC 并在实际将 MOC 内容保存到之前调用 NSFRC 委托上的willChangeContent:..
,didChangeContent:..
等回调磁盘。
这可能有问题的原因是,如果您尝试使用NSDictionaryResultType
那些 NSFRC 回调中的 resultType 执行新的提取请求,那么您的提取请求将不包括任何当前更改。通过当前的更改,我指的是那些首先调用您的 NSFRC 回调的更改。
您看不到这些更改的原因是因为将 resultType 设置为NSDictionaryResultType
关闭该includesPendingChanges
属性。因此 fetch 请求仅直接从磁盘获取更改,不会合并上下文中的任何本地更改。
我可以理解为什么使用字典结果类型的任意获取请求不合并上下文中未保存的结果的原因,因为字典可以具有任意结构,而 MOC 正在对图形中的对象和关系进行建模,但是,部分让我感到有趣和惊讶的是,NSFRC 代表在实际完成保存之前收到了更新回调。
这是一些ASCII艺术:
1. 保存 Main MOC --> | 2. NSFRC 回调 --> | 3. 实际保存发生在这里 | | | | | | | ▼ | | NSDictionaryResultType | | 获取请求不会 | | 查看来自 | 的任何更改 | 这个当前保存,但是 | | 常规获取请求 | | 会看到这些变化|
PS:Core Data 是一个运行在性能有限的设备上的对象图管理框架。有时你必须优化。