Я хочу настроить сохранение данных в частной очереди ManagedObjectContext, но не могу сделать это правильно.
Я сохранил данные с одним контекстом в mainThread, и он работал нормально. Но после того, как я добавил функции .perform () и executeAndWait () , я не могу получить свои данные в 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 file:
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()
}
Что я не так сделал?