好的,我有一个非常棘手的问题,我花了好几天才明白并知道我不确定如何修复它。
我有一个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?
由于
答案 0 :(得分:2)
上下文应该锁定他们共享的持久存储协调器以防止这些问题。
如果进程3和进程4在主线程上运行,那么4如何在3完成之前启动?不要忘记在发布它们的线程上收到通知,因此您需要显式执行代码以合并主线程上的更改(如果我说明显而易见,请道歉。)