Ferrite-backup/Ferrite/DataManagement/PersistenceController.swift
kingbri d15b0e0735 Settings: Fix how modified source lists are saved
Since an existing source list is fetched from the ViewContext, save
in the scope of that context. This will fix any fetching issues
when grabbing sources from the new URL.

Signed-off-by: kingbri <bdashore3@gmail.com>
2022-08-16 14:19:39 -04:00

85 lines
2.8 KiB
Swift

//
// PersistenceController.swift
// Ferrite
//
// Created by Brian Dashore on 7/24/22.
//
import CoreData
// No iCloud until finalized sources
struct PersistenceController {
static var shared = PersistenceController()
// Coredata storage
let container: NSPersistentContainer
// Background context for writes
let backgroundContext: NSManagedObjectContext
// Coredata load
init(inMemory: Bool = false) {
container = NSPersistentContainer(name: "FerriteDB")
if inMemory {
container.persistentStoreDescriptions.first?.url = URL(fileURLWithPath: "/dev/null")
}
guard let description = container.persistentStoreDescriptions.first else {
fatalError("CoreData: Failed to find a persistent store description")
}
description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
container.viewContext.automaticallyMergesChangesFromParent = true
container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
try? container.viewContext.setQueryGenerationFrom(.current)
container.loadPersistentStores { _, error in
if let error = error {
fatalError("CoreData init error: \(error)")
}
}
backgroundContext = container.newBackgroundContext()
backgroundContext.automaticallyMergesChangesFromParent = true
backgroundContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
try? backgroundContext.setQueryGenerationFrom(.current)
container.viewContext.automaticallyMergesChangesFromParent = true
container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
try? container.viewContext.setQueryGenerationFrom(.current)
}
func save(_ context: NSManagedObjectContext? = nil) {
let context = context ?? container.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
debugPrint("Error in CoreData saving! \(error.localizedDescription)")
}
}
}
// By default, delete objects using the ViewContext unless specified
func delete(_ object: NSManagedObject, context: NSManagedObjectContext? = nil) {
let context = context ?? container.viewContext
if context != container.viewContext {
let wrappedObject = try? context.existingObject(with: object.objectID)
if let backgroundObject = wrappedObject {
context.delete(backgroundObject)
save(context)
return
}
}
container.viewContext.delete(object)
save()
}
}