import Foundation import CoreData final class CoreDataManager { static let shared = CoreDataManager() func getContext() -> NSManagedObjectContext { return context } private var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "MyApp") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { debugPrint("Failed to load persistant store: \(error), \(error.userInfo)") } }) return container }() private func getViewContext() -> NSManagedObjectContext { let context = persistentContainer.viewContext context.mergePolicy = NSMergePolicyType.mergeByPropertyObjectTrumpMergePolicyType return context } private func getNewBackgroundContext() -> NSManagedObjectContext { let context = persistentContainer.newBackgroundContext() context.mergePolicy = NSMergePolicyType.mergeByPropertyObjectTrumpMergePolicyType return context } private var context: NSManagedObjectContext { Thread.isMainThread ? getViewContext() : getNewBackgroundContext() } func saveContext (_ inContext: NSManagedObjectContext? = nil) { if let context = inContext { if context.hasChanges { do { try context.save() } catch { let nserror = error as NSError debugPrint("Failed to load persistant store: \(nserror), \(nserror.userInfo)") } } } else { let context = getContext() context.perform { if context.hasChanges { do { try context.save() } catch { let nserror = error as NSError debugPrint("Failed to load persistant store: \(nserror), \(nserror.userInfo)") } } } } } func clear() { let context = getContext() context.perform { [self] in ... delete some data ... saveContext(context) } } private func deleteAllData(_ entity:String, _ context: NSManagedObjectContext) { let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity) let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest) do { try context.execute(batchDeleteRequest) } catch let error { print("Delete all data in \(entity) error: ", error) } } }