Ios 在更新NSFetchedResultsController之前,核心数据是否确实保存了对磁盘的任何更改?
这是一个非常具体的问题,我刚才被它咬了一口,所以为了节省其他人的时间和痛苦,这里是我的问题的深度和解决方案 例如,当您保存主上下文并触发NSFetchedResultsController委托回调时,您能否依赖于您的保存实际已完成这一事实,并且假设将包含当前保存的数据,您能否在这些回调中安全地执行新的提取请求Ios 在更新NSFetchedResultsController之前,核心数据是否确实保存了对磁盘的任何更改?,ios,objective-c,core-data,Ios,Objective C,Core Data,这是一个非常具体的问题,我刚才被它咬了一口,所以为了节省其他人的时间和痛苦,这里是我的问题的深度和解决方案 例如,当您保存主上下文并触发NSFetchedResultsController委托回调时,您能否依赖于您的保存实际已完成这一事实,并且假设将包含当前保存的数据,您能否在这些回调中安全地执行新的提取请求 答案是否定的。如果你的应用程序中有活动的NSFETCHEEDRESULTSCONTROLLER's(NSFRC),它有一个委托集,并且正在监视相关对象的更改,那么这里有一个小的未记录的警告
答案是否定的。如果你的应用程序中有活动的NSFETCHEEDRESULTSCONTROLLER's(NSFRC),它有一个委托集,并且正在监视相关对象的更改,那么这里有一个小的未记录的警告,所有核心数据开发人员都应该注意。如果在主上下文上执行保存,并让NSFRC在主上下文上工作,那么在主上下文上调用
save:
实际上会首先更新NSFRC,并调用willChangeContent:…
,didChangeContent:…
,等。在实际将MOC内容保存到磁盘之前,对NSFRC委托进行回调
这可能有问题的原因是,如果您尝试在这些NSFRC回调中使用resultType为NSDictionaryResultType
的resultType执行新的获取请求,则获取请求将不包括任何当前更改。所谓当前更改,我指的是那些最初调用NSFRC回调的更改
您看不到这些更改的原因是,将resultType设置为NSDictionaryResultType
将关闭IncludePendingChanges
属性。因此,fetch请求只直接从磁盘获取更改,而不合并来自上下文的任何本地更改
我可以理解为什么使用字典结果类型的任意获取请求不会合并上下文中未保存的结果,因为字典可以具有任意结构,而MOC正在图形中建模对象和关系,令我感兴趣和惊讶的是,NSFRC委托在实际执行保存之前得到了更新回调
以下是一些ASCII艺术:
1. save Main MOC --> | 2. NSFRC callbacks --> | 3. actual save happens here
| | |
| | |
| ▼ |
| NSDictionaryResultType |
| fetch requests won't |
| see any changes from |
| this current save, but |
| regular fetch requests |
| will see those changes |
1.保存主MOC-->2。NSFRC回调-->3。实际保存发生在这里
| | |
| | |
| ▼ |
|NSDictionaryResultType|
|获取请求将不可用|
|从中查看任何更改|
|这是当前保存,但是|
|定期提取请求|
|我们将看到这些变化|
核心数据是一个运行在性能有限的设备上的对象图管理框架。有时你需要进行优化。如果你的应用程序中有活动的NSFETCHEEDRESULTSCONTROLLER's(NSFRC),它有一个委托集,并且正在监视对相关对象的更改,那么这里有一个小的未记录的警告,所有核心数据开发人员都应该注意。如果在主上下文上执行保存,并让NSFRC在主上下文上工作,那么在主上下文上调用
save:
实际上会首先更新NSFRC,并调用willChangeContent:…
,didChangeContent:…
,等。在实际将MOC内容保存到磁盘之前,对NSFRC委托进行回调
这可能有问题的原因是,如果您尝试在这些NSFRC回调中使用resultType为NSDictionaryResultType
的resultType执行新的获取请求,则获取请求将不包括任何当前更改。所谓当前更改,我指的是那些最初调用NSFRC回调的更改
您看不到这些更改的原因是,将resultType设置为NSDictionaryResultType
将关闭IncludePendingChanges
属性。因此,fetch请求只直接从磁盘获取更改,而不合并来自上下文的任何本地更改
我可以理解为什么使用字典结果类型的任意获取请求不会合并上下文中未保存的结果,因为字典可以具有任意结构,而MOC正在图形中建模对象和关系,令我感兴趣和惊讶的是,NSFRC委托在实际执行保存之前得到了更新回调
以下是一些ASCII艺术:
1. save Main MOC --> | 2. NSFRC callbacks --> | 3. actual save happens here
| | |
| | |
| ▼ |
| NSDictionaryResultType |
| fetch requests won't |
| see any changes from |
| this current save, but |
| regular fetch requests |
| will see those changes |
1.保存主MOC-->2。NSFRC回调-->3。实际保存发生在这里
| | |
| | |
| ▼ |
|NSDictionaryResultType|
|获取请求将不可用|
|从中查看任何更改|
|这是当前保存,但是|
|定期提取请求|
|我们将看到这些变化|
核心数据是一个运行在性能有限的设备上的对象图管理框架。有时你需要优化。+1用于ASCII艺术。核心数据是一个“未记录的警告”,但我们现在不要讨论这个问题。@matt:▼ = U+25BC不是ASCII:-)+1,不过是为了获取有趣的信息。@MartinR-我本想偷偷把它放进去,但被抓住了。触摸!这是因为FRC监视
nsManagedObjectContextObjectsIDChangeNotification
,它是处理挂起的更改时生成的。当前用户事件完成后,将处理挂起的更改,因此FRC无需保存即可查看MOC的更改。在保存之前,当您调用save
时,将立即处理挂起的更改。因此,您的回调正在被调用