2

好的,我有一个非常棘手的问题,我花了几天时间来理解并且知道我不确定如何解决它。

我有一个从具有不同上下文的不同线程更新的 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 可以正常工作,但有时主线程会收到重叠更新事件,并且您的 process4 在 process3 完成之前就开始读取数据库。

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

谢谢

4

1 回答 1

2

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

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

于 2011-02-02T11:26:47.437 回答