情景:
我在IOS上使用配置为针对SQLite数据库进行操作的Magical记录。默认情况下,MR配置coredata以将所有写入序列化回主线程上的父上下文。
我使用的模式是当我不在主线程上时,我使用像MagicalRecord:MR_saveWithBlockAndWait之类的东西为coredata操作创建一个单独的NSManagedObjectContext。魔法记录创建上下文,将其挂接到父上下文,执行您在回调块中指定的任何操作,最后保存。重要的是,保存应该在操作完成之前提交。
当我完成后台线程的工作时,我通常会通知UI发生的事情;例如:下载/上传/更改某些内容。
在UI线程上,我然后使用主线程上的默认上下文创建一个新的获取请求。问题是偶尔coredata找不到我之前提交的新对象。问题表现在微妙的竞争条件下,如果UI线程由于动画或任何一切都工作得很慢 - 但有时候它找不到新的对象。
从我所读到的内容中,获取请求总是应该转到磁盘上。 MOC上还有一个陈旧性属性,但听起来只是关于缓存,如果你做一个获取请求就被绕过。
是否有人遇到类似问题并有任何见解?感谢。
答案 0 :(得分:1)
不确定。如果您在后台管理对象上下文中保存更改,但您的UI上下文已经加载了该对象,则UI上下文可能只是从其缓存而不是存储文件中提供数据。
使用多个上下文的常用方法是:
观察NSManagedObjectContextDidSaveNotification
,以便您知道背景上下文何时保存更改。
在此通知的处理程序中,在UI上下文中调用mergeChangesFromContextDidSaveNotification:
,以便它将根据其他上下文的更改自行更新。
您可能希望在UI上下文中设置mergePolicy
,因为如果存在任何冲突的更改,则默认为放弃。
这适用于任何多个上下文场景,其中每个上下文都需要使用不同上下文保存的更改进行更新。