【发布时间】:2019-06-21 17:45:07
【问题描述】:
我想在 ManagedObjectContext 的私有队列上设置保存数据,但无法正确执行。
我已经在 mainThread 中使用一个上下文保存了数据,它工作正常。但是当我添加 .perform() 和 performAndWait() 函数后,我无法在 SQLite 中获取我的数据。
我在 CoreDataManager.swift 文件中有这个功能:
func saveContext() {
privateObjectContext.perform {
do {
try self.privateObjectContext.save()
self.mainObjectContext.performAndWait {
do {
try self.mainObjectContext.save()
} catch {
fatalError("Failure to save context: \(error)")
}
}
} catch {
fatalError("Failure to save context: \(error)")
}
}
并从 Repository.swift 文件中调用此函数:
func insertQuestProgress(qp: QuestProgress) {
//here's my code
CoreDataManager.instance.saveContext()
}
同样在 CoreDataManager.swift 文件中,我初始化了 privateContext 和 mainContext 的变量,就像在关于这个主题的大量文章中一样:
private lazy var privateObjectContext: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
managedObjectContext.parent = self.mainObjectContext
return managedObjectContext
}()
private lazy var mainObjectContext: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = CoreDataManager.instance.persistentContainer.persistentStoreCoordinator
return managedObjectContext
}()
也许它不保存,因为在 insertQuestProgress(qp: QuestProgress) 我创建了具有 CoreDataManager.instance.persistentContainer.viewContext
上下文的新实体func deleteQuestProgress(id: String) {
let questProgresses = CoreDataManager.instance.fetchQuestprogress()
guard let questProgress = questProgresses.first(where: {$0.questId == id}) else {return}
CoreDataManager.instance.persistentContainer.viewContext.delete(questProgress)
CoreDataManager.instance.saveContext()
}
func insertQuestProgress(qp: QuestProgress) {
if let quest = getQuestProgressEntityById(id: qp.questId){
quest.qpJson = converter.toJson(value: qp)
}
else{
let questProgress = QuestProgressEntity(context: CoreDataManager.instance.persistentContainer.viewContext)
questProgress.questId = qp.questId
questProgress.qpJson = converter.toJson(value: qp)
}
CoreDataManager.instance.saveContext()
}
我做错了什么?
【问题讨论】:
标签: swift core-data queue nsmanagedobjectcontext