【问题标题】:Objects should not be both modified and additional对象不应同时被修改和附加
【发布时间】:2018-09-28 16:48:36
【问题描述】:

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

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

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

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

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

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

问题

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

【问题讨论】:

    标签: ios swift multithreading core-data cloudkit


    【解决方案1】:

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

    解决方法是让事情同步发生,对我来说,简单的解决方法是将保存操作移动到主线程,例如(在 Swift 中):

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

    【讨论】:

      【解决方案2】:

      我最近也遇到了这个错误,而且前后不一致。我有几个具有 1:many 关系的核心数据对象,当我将对象添加到该关系并保存上下文时,我会随机收到此异常。

      对我来说,问题原来是我使用的是NSPersistentContainer.viewcontext

      1. 在后台线程中并且
      2. 写入核心数据

      根据这些文档https://developer.apple.com/documentation/coredata/nspersistentcontainer viewcontext 应该只读用于主队列。改用NSpersistentContainer.newBackgroundContext 解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多