gpt4 book ai didi

ios - 使用 NSPersistentContainer 在后台保存托管对象的更改

转载 作者:行者123 更新时间:2023-11-29 05:11:23 27 4
gpt4 key购买 nike

我在一些地方(例如 a high score answer here )读到,将主托管上下文作为后台托管上下文的子级是一种很好的做法,可以节省 save() 时间并提高 UI 响应能力。

Persistent Store Coordinator

Managed Object Context (for saving) <= note this

Managed Object Context (main)

Managed Object Context (for editing)

但问题是,iOS 模板代码创建的主要托管上下文与持久存储协调器相关联,并且似乎没有支持的方法来更改它。我尝试了以下代码:

lazy var persistentContainer: NSPersistentContainer = {
// Template code: create persistent container
// ...

// My code
let saveMOC = container.newBackgroundContext()
container.viewContext.persistentStoreCoordinator = nil
container.viewContext.parent = saveMOC

return container
}()

但是得到了一个 NSException:

uncaught exception 'NSInternalInconsistencyException', reason: 'Context already has a coordinator;  cannot replace.'

我的问题是:

1) 这是否意味着,要实现上述架构,我不能使用 NSPercientContainer,而必须使用自己的代码设置核心数据堆栈?

2) 鉴于 NSPercientContainer 是新的 API,我认为它必须有某种方法来达到相同的效果(在后台线程中保存托管对象的更改)。我想知道那是什么?我正在考虑以下方法,其中 save() 仅在保存上下文中调用,而不是在主上下文中调用。但它更复杂,并且不像上面的那样自然。有没有更简单的方法?

          Persistent Store Coordinator
↑ ↑
Context (main) --merge--> Context (saving)

Context (editing)

更新:再想一想,这种方法行不通,因为合并是基于通知的。如果主上下文中没有调用 save(),则不会触发任何通知。

嗯,我想知道是否可以创建另一个 mainQueueConcurrencyType 的 NSManagedObjectContext,按照我最初的意愿进行设置,然后用它替换 NSPersistentContainer 创建的 NSManagedObjectContext?

感谢您的任何建议。

最佳答案

我想我可能找到解决方案:

    persistent store coordinator
↑ ↑
main context private context (edit, fetch, etc.)
  • 所有编辑均在私有(private)环境中完成
  • 主上下文不会更改托管对象,而只是从持久存储协调器获取更新。它通过将 automaticallyMergesChangesFromParent 设置为 true 来实现此目的。

这意味着每次在私有(private)上下文中编辑托管对象时,都应立即调用 save() 调用。

我认为,一个基本情况是用户在调用 save() 时暂停应用程序,这可能会导致主上下文更新 View ,而 View 已从屏幕上删除。但我认为即使没有 Core Data 多线程,这种情况也可能发生,所以我认为 UIKit 应该能够正确处理这种情况。

关于ios - 使用 NSPersistentContainer 在后台保存托管对象的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59647349/

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