Accessing Core Data Stack in MVVM application

后端 未结 1 1852
情深已故
情深已故 2020-12-04 01:09

I\'m writing an application using the MVVM pattern. And I\'m wondering know how to create the CoreData stack so it can be accessed from various pla

相关标签:
1条回答
  • 2020-12-04 01:20

    You can use Core Data Singleton class

    import CoreData
    
    class CoreDataStack {
        static let shared = CoreDataStack()
    
        private init() {}
    
        var managedObjectContext: NSManagedObjectContext {
            return self.persistentContainer.viewContext
        }
    
        var workingContext: NSManagedObjectContext {
            let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
            context.parent = self.managedObjectContext
            return context
        }
    
        // MARK: - Core Data stack
    
        lazy var persistentContainer: NSPersistentContainer = {
            let container = NSPersistentContainer(name: "MyStuff")
            container.loadPersistentStores(completionHandler: { storeDescription, error in
                if let error = error as NSError? {
                    RaiseError.raise()
                }
            })
            return container
        }()
    
        // MARK: - Core Data Saving support
    
        func saveContext() {
            self.managedObjectContext.performAndWait {
                if self.managedObjectContext.hasChanges {
                    do {
                        try self.managedObjectContext.save()
                        appPrint("Main context saved")
                    } catch {
                        appPrint(error)
                        RaiseError.raise()
                    }
                }
            }
        }
    
        func saveWorkingContext(context: NSManagedObjectContext) {
            do {
                try context.save()
                appPrint("Working context saved")
                saveContext()
            } catch (let error) {
                appPrint(error)
                RaiseError.raise()
            }
        }
    }
    

    Core Data is not thread safe. If you write something on manageObject and don't want to save that, but some other thread save the context, then the changes that you don't want to persist will also persist.

    So to avoid this situation always create working context - which is private.

    When you press save, then first private context get saved and after that you save main context.

    In MVVM you should have DataLayer through which your ViewModel interact with Core Data singleton class.

    0 讨论(0)
提交回复
热议问题