iphone - 防止 NSManagedObjectContextDidSaveNotification 事件重叠

标签 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 ?

谢谢

最佳答案

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

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

关于iphone - 防止 NSManagedObjectContextDidSaveNotification 事件重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4872965/

相关文章:

ios - 需要UITableView的cellForRowAtIndexPath : to return nothing for some rows

ios - NSNotification keyBoardWillShow 和 KeyboardWillHide 未被调用

ios - 通过 UiControls 过滤 CoreData 记录的最佳实践

ios - Swift 和 EXT_BAD_ACCESS 中的详细文本标签

objective-c - 快速从嵌入式页面 View Controller 全屏显示图像

iphone - 将 UITextField 设置为不可编辑 - Objective C

iphone - 在 iOS 上使用多重采样抗锯齿会对性能产生什么影响?

objective-c - 如何在 mac 中的 Objective-C 中计算应用程序和缓存内存,如事件监视器?

ios - CoreData严重应用错误

iphone:如何进行翻页