【发布时间】:2020-09-17 01:34:49
【问题描述】:
我打开了 CoreData 并发调试器,并且我在每个地方都在断言。我想不通。
我在后台线程上创建了我认为的上下文。请看一下我的 CoreData Stack:
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()
}
我该如何做到这一点,这样我就不会得到核心数据并发断言并正确地做到这一点?请帮忙。
【问题讨论】:
-
所以我想我发现了如何使用 .perform {} 块写入 privateMOC 上下文。但是现在我保存到私有上下文的对象不在 mainContext 中。我如何同步它们。这太复杂了。我一定是做错了什么
-
你可以试试this 吗?
标签: swift core-data concurrency nsmanagedobjectcontext