2

好吧我有一个非常棘手的问题,我花了几天的时间去了解并知道我不知道如何解决它。防止NSManagedObjectContextDidSaveNotification事件重叠

我有一个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 

在这个伪代码示例过程1和过程2工作没有问题 但有时候主线程接收重叠的更新事件和 你process4开始process3完成之前读取数据库。

有没有官方的方式来处理? CoreData是否为这种情况提供了一个解决方案 ,还是我必须使用NSLock?

感谢

+0

你可以发布处理合并通知的代码部分吗?没有这一点,我不认为有更多的人能够推断出来。正如我在回答中所说的,上下文锁定持久性商店协调员以序列化访问,这应该可以防止这些类型的问题。 – paulbailey 2011-02-03 18:08:02

回答

2

的背景下,应锁定持久存储协调它们共享,以防止这些问题。

如果进程3和进程4在主线程上运行,那么4在3结束之前如何启动?不要忘记,在发布它们的线程上接收到通知,因此您需要明确执行代码以合并主线程上的更改(如果我明确指出,请致歉)。

+0

感谢您的评论。我更新了我的问题,因为我发现这是更复杂的,因为有一个NSFetchResultsController涉及。不知何故,当NSFetchResultsControllerDelegate正在处理最后一次更新时,数据库有时会被更新,这会导致问题 – CodeFlakes 2011-02-02 12:39:31