对象不应该被修改和附加

时间:2018-04-18 12:31:15

标签: ios swift multithreading core-data cloudkit

我所从事的项目的一部分涉及管理产品的存储。 Storage对象包含StorageShelf个对象,用于定义货架数量。反过来,StorageShelf包含一些其他对象,例如StorageLocation个对象,用于确定可以放在架子上的产品数量。所有这些对象都存在于CoreData中。我还将StoragesStorageShelfs存储在CloudKit数据库中以进行同步。

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

我的应用中有一个maxConcurrentOperationCount为1的CloudOperationQueue,以确保同时只进行一次更新(这是因为我的应用的所有对象,也是因为这个问题的范围是高度相互依存的。)

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

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Objects should not be both modified and additional'

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

问题

这个错误意味着什么,以及如何调试它?

2 个答案:

答案 0 :(得分:1)

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

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

DispatchQueue.main.async {
   // save your context
}

答案 1 :(得分:0)

最近我也收到此错误,而且不一致。我有几个核心数据对象,它们之间的关系为1:许多,当我将一个对象添加到该关系并保存上下文时,我会随机收到此异常。

对我来说,问题出在我正在使用NSPersistentContainer.viewcontext

  1. 在后台线程中
  2. 写入核心数据
根据这些文档https://developer.apple.com/documentation/coredata/nspersistentcontainer viewcontext的

,应仅对主队列读取。改用NSpersistentContainer.newBackgroundContext可以解决问题。