gpt4 book ai didi

swift - 如果必须仅从主线程使用 UIApplication.delegate,如何访问 managedObjectContext?

转载 作者:行者123 更新时间:2023-11-28 06:00:32 26 4
gpt4 key购买 nike

所以多年来我一直在执行以下操作来访问我的 managedObjectContext 通用实例。

let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext

现在,当我想在后台线程上做一些 CoreData 工作时,我会执行以下操作:

let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateContext.persistentStoreCoordinator = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext!.persistentStoreCoordinator
privateContext.perform { //Do work

好吧,我现在在 Swift 4 中收到以下错误。

UIApplication.delegate must be used from main thread only

重点是在后台线程上做工作,现在最好的做法是什么?为我的后台线程创建一个新的 managedObjectContext?

最佳答案

如果你想在一个单独的线程上做核心数据工作,你应该为每个线程有一个单独的托管对象上下文。请参阅 Core Data Concurrency docs使用专用队列支持并发部分.确保设置它的 parentContext:

let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = moc

这将帮助您确保数据完整性。有几点需要注意。这是大的,来自 NSManagedObjectContext docsparent store 部分:

When you save changes in a context, the changes are only committed “one store up.” If you save a child context, changes are pushed to its parent. Changes are not saved to the persistent store until the root context is saved. (A root managed object context is one whose parent context is nil.) In addition, a parent does not pull changes from children before it saves. You must save a child context if you want ultimately to commit the changes.

就存储位置而言——它可以在任何有意义的对象上的任何位置,但要避免将其存储在 UIKit 对象上以避免主线程警告。

关于swift - 如果必须仅从主线程使用 UIApplication.delegate,如何访问 managedObjectContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49933271/

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