gpt4 book ai didi

ios - 一个NSPersistentStoreCoordinator下的多个NSManagedObjectContext抛出 'statement is still active'异常

转载 作者:可可西里 更新时间:2023-11-01 05:40:34 25 4
gpt4 key购买 nike

我正在将我的 CoreData 设置更改为在 1 个 NSPersistentStoreCoordinator 下有 2 个 NSManagedObjectContext

  1. Root Context 是使用 NSPrivateQueueConcurrencyType 实例化的 NSManagedObjectContext 并设置为 NSMergeByPropertyStoreTrumpMergePolicy
  2. Main Context 是使用 NSMainQueueConcurrencyType 实例化的 NSManagedObjectContext 也设置为 NSMergeByPropertyStoreTrumpMergePolicy

它们都没有通过“父子”关系连接,但是它们被分配了相同的 NSPersistentStoreCoordinator 对象。 Main Context 正在监听 Root ContextNSManagedObjectContextDidSaveNotification 通知,并在 performBlock 中进行必要的合并:/p>

有时,当 NSFetchedResultsController 的实例与 Main Context Hook 时,我会执行 performFetch

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“语句仍然有效”

我想知道我在这里要做的是不应该做还是 Core Data 的限制。

谢谢

最佳答案

Florian Kugler 写了一篇关于此的好文章:The Concurrent Core Data Stack

想法是将您的数据导入私有(private)队列上下文(导入上下文),它是主上下文的子上下文。

这个Main Context在主队列(我喜欢称它为UI队列)上,所以你可以在主线程(UI线程)中使用它之外的对象,而不必将它们从主线程的私有(private)线程。

最后,Main Context 是您的 Root Context 的子级,它在自己的私有(private)队列中运行。这样保存将在后台线程中完成,不会阻塞您的 UI。

Since in this setup you never touch the [Root Context], i.e. you never directly make changes to it, all changes flow through the main context. Therefore you will always have the latest data available on the main thread. No need for listening to change notifications and merging changes manually.

我一开始就不会担心性能。核心数据经过高度优化,如果出现性能问题,您可以减少单个导入 worker 保存的数据量。

关于ios - 一个NSPersistentStoreCoordinator下的多个NSManagedObjectContext抛出 'statement is still active'异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32602631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com