我正在使用CoreData,并且在尝试在容器的performBackgroundTask函数中保存context时遇到问题。
我同时在多个地方打电话。我的理解是,每次尝试将线程保存到persistentStore时,线程都会有所不同,从而导致问题。
我想到使用childContext的方法和其他方法,直到遇到以下文章:
https://blog.five.agency/how-to-import-a-large-data-set-using-core-data-6c248a503148
在本文中,coreData堆栈如下:
final class DataCoordinator {
//MARK: - singleton
static let sharedInstance = DataCoordinator()
//MARK: - init
public var container : NSPersistentContainer
private init() {
container = NSPersistentContainer(name: "Model")
container.loadPersistentStores(completionHandler: { (_, error) in
if let error = error {
fatalError("Unresolved error \(error)")
}
})
}
//MARK: - perform methods
static func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
DataCoordinator.sharedInstance.container.performBackgroundTask(block)
}
static func performViewTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
block(DataCoordinator.sharedInstance.container.viewContext)
}
}
我的问题是使用这种方法,静态函数performBackgroundTask是否会解决此问题,并始终在同一队列中为我提供相同的背景上下文,或者这与我以前每次对container.performBackgroundTask所做的操作没有什么不同?>
想知道如何在同一队列中同时从多个位置保存?
答案 0 :(得分:0)
首先,它与队列无关,NSManagedObjectContext
在不同的队列上运行,例如viewContext在主队列上运行。因此,就您而言,我想您要使用相同的NSManagedObjectContext
从不同位置保存吗?在这种情况下,您可以获得一个newBackgroundContext并保存其引用,然后使用此上下文从所有位置保存您的任务。使用NSPersistentContainer
的以下方法获取背景上下文。
func newBackgroundContext() -> NSManagedObjectContext
如果我对您的问题的理解是错误的,请告诉我更多信息,以便为您提供其他解决方案。
同样,您提到的教程的以下方法对您不起作用
static func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
DataCoordinator.sharedInstance().container.performBackgroundTask(block)
}
因为performBackgroundTask
总是创建一个新的上下文。苹果医生说:
每次调用此方法时,持久性容器都会创建一个新的NSManagedObjectContext
,并将concurrencyType设置为NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType.
。然后,持久性容器将针对上下文创建的上下文在私有队列中执行传入的块