对象不应同时被修改和附加

Jor*_*416 5 multithreading core-data ios swift cloudkit

我正在参与的项目的一部分涉及管理产品的存储。一个Storage对象包含StorageShelf定义货架数量的对象。StorageShelf 又包含一些其他对象,例如StorageLocation确定货架上可容纳的产品数量的对象。所有这些对象都存在于 CoreData 中。我还将Storages和存储StorageShelfs在 CloudKit 数据库中以用于同步目的。

如果我在两台 iPad 上运行我的应用程序,并在其中一台设备上添加带有一些架子的存储,则它会在另一台设备上接收通知并开始处理收到的更新。

我的应用程序中有一个 CloudOperationQueue,其值为maxConcurrentOperationCount1,以确保同时只进行一次更新(这是因为我的应用程序的所有对象,以及超出此问题范围的对象都是高度相互依赖的) 。

不一致的是,这会导致以下SIGABRT错误消息:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Objects should not be both modified and additional'
Run Code Online (Sandbox Code Playgroud)

具体来说,当我在修改收到的架子对象之一后保存上下文时,会发生此错误。哪个货架没有一致性。

问题

这个错误是什么意思,如何调试它?

小智 2

我最近遇到了这个错误,而且不一致。该问题与添加对象然后将 CoreData 上下文保存在后台线程上(拖放更新的一部分)有关,同时还尝试更新显示主线程上的对象列表的视图。

修复方法是使事情同步发生,对我来说,简单的修复方法是将保存操作移至主线程,例如(在 Swift 中):

DispatchQueue.main.async {
   // save your context
}
Run Code Online (Sandbox Code Playgroud)