我正在使用CoreData,并且在尝试在容器的performBackgroundTask函数中保存上下文时遇到问题。
我同时从多个地方打电话给我。我的理解是,每次尝试保存到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所做的操作没有什么不同?
想知道如何在同一队列中同时从多个位置保存吗?
最佳答案
嗨,第一件事不是队列,NSManagedObjectContext
在不同的队列上运行,例如viewContext在主队列上运行。因此,就您而言,我想您要使用相同的NSManagedObjectContext
从不同位置保存吗?在这种情况下,您可以获取一个newBackgroundContext并保存其引用,并使用此上下文从所有位置保存您的任务。使用NSPersistentContainer
的以下方法获取背景上下文。
func newBackgroundContext() -> NSManagedObjectContext
如果我对您的问题的理解是错误的,请告知我,以便为您提供其他解决方案。
同样,您提到的教程的以下方法对您不起作用
static func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
DataCoordinator.sharedInstance().container.performBackgroundTask(block)
}
因为
performBackgroundTask
总是创建一个新的上下文。苹果医生说:每次调用此方法时,持久性容器都会将concurrencyType设置为
NSManagedObjectContext
的情况下创建一个新的NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType.
。然后,持久性容器将在上下文的专用队列上针对该新创建的上下文执行传入的块。关于ios - CoreData performBackgroundTask冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51463542/