正在从后台线程使用CoreData managedContext..你怎么做才正确



我打开了CoreData并发调试器,我正在断言每个位置。我想不通。

我在一个背景线程上创建了一个我认为是上下文的东西。请查看我的核心数据堆栈:

import Foundation
import CoreData
class CoreDataManager {
lazy var managedContext: NSManagedObjectContext = {
return self.storeContainer.viewContext
}()

lazy var backgroundContext: NSManagedObjectContext = {

return self.storeContainer.newBackgroundContext()
}()

lazy var privateMOC: NSManagedObjectContext = {
let pMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
pMOC.parent = self.storeContainer.viewContext
return pMOC
}()

private lazy var storeContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "XXXX")


container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
print("Unresolved error (error), (error.userInfo)")
}
})
return container
}()

func saveContext () {
guard managedContext.hasChanges else { return }

do {
try managedContext.save()
} catch let error as NSError {
print("Unresolved error (error), (error.userInfo)")
}

self.reset()
}

func reset() {
managedContext.reset()
}

}

然后,我尝试从存储库类型类中的后台线程执行任务:

func deleteAllData() {
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Pairing")
let pairings = (try? self.coreDataManager.privateMOC.fetch(fetchRequest)) as! [Pairing_ManagedObject]. // I GET THE ASSERT HERE
for pairing in pairings {
self.coreDataManager.privateMOC.delete(pairing)
}
self.coreDataManager.saveContext()
}

我该如何做到这一点,这样我就不会得到核心数据并发断言并正确执行它?请帮忙。

您正在创建一个具有私有队列并发性的新托管对象上下文,但这还不足以避免并发问题。核心数据的策略是,必须使用performBlockperformBlockAndWait来执行所有使用该上下文的操作。在您的代码中,这意味着deletesave调用必须使用其中一个函数来完成。

不过还有第二个问题。您正在使用saveContext函数保存更改。但这并不能保存对私有队列上下文的更改。它保存了另一个名为managedContext的上下文。在一个上下文上保存不会自动保存其他上下文。如果要更改专用队列上下文并保存这些更改,则需要在某个时刻保存该上下文。

最新更新