防止NSManagedObjectContextDidSaveNotification事件重叠

时间:2011-02-02 09:58:04

标签: iphone objective-c core-data nsfetchedresultscontroller nsnotifications

好的,我有一个非常棘手的问题,我花了好几天才明白并知道我不确定如何修复它。

我有一个CoreData数据库从不同的线程更新了不同的上下文。我的问题是有时NSManagedObjectContextDidSaveNotification事件重叠并导致导致崩溃的基础损坏。这是一个例子:

Thread                   Main                                          NSFetchResultsController

Update database
Save database           NSManagedObjectContextDidSaveNotification1
                        merge                                          delegate process 1
                                                                       process 1 done

Update database
Save database           NSManagedObjectContextDidSaveNotification2
                        merge                                          delegate process 2
                                                                       process 2 done
Update database
Save database           NSManagedObjectContextDidSaveNotification3
                        merge                                          delegate process 3

Update database
Save database           NSManagedObjectContextDidSaveNotification4
                        merge          

                                                                       process 3 done
                                                                       delegate process 4
                                                                       CRASH
                                                                       process 4 done

在这个伪代码示例中,process1和process2可以正常工作 但有时主线程会收到重叠的更新事件和 在process3完成之前,你有process4开始读取数据库。

有没有正式的方法来解决这个问题? CoreData是否提供解决方案 对于这种情况还是我必须使用NSLock?

由于

1 个答案:

答案 0 :(得分:2)

上下文应该锁定他们共享的持久存储协调器以防止这些问题。

如果进程3和进程4在主线程上运行,那么4如何在3完成之前启动?不要忘记在发布它们的线程上收到通知,因此您需要显式执行代码以合并主线程上的更改(如果我说明显而易见,请道歉。)