OSDN Git Service

保存用NSManagedObjectContextを用いいるようにした
authormasakih <masakih@users.sourceforge.jp>
Mon, 12 Mar 2018 15:03:38 +0000 (00:03 +0900)
committermasakih <masakih@users.sourceforge.jp>
Sun, 18 Mar 2018 01:40:33 +0000 (10:40 +0900)
KCD/CoreDataCore.swift
KCD/CoreDataManager.swift
KCD/MOCGenerator.swift

index 0bfe647..d9b08e3 100644 (file)
@@ -40,7 +40,8 @@ struct CoreDataConfiguration {
 struct CoreDataCore {
     
     let config: CoreDataConfiguration
-    let parentContext: NSManagedObjectContext
+    let writerContext: NSManagedObjectContext
+    let readerContext: NSManagedObjectContext
     private let model: NSManagedObjectModel
     private let coordinator: NSPersistentStoreCoordinator
     
@@ -50,7 +51,11 @@ struct CoreDataCore {
         
         do {
             
-            (model, coordinator, parentContext) = try MOCGenerator(config).genarate()
+            (model, coordinator, writerContext) = try MOCGenerator(config).genarate()
+            
+            readerContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
+            readerContext.parent = writerContext
+            readerContext.undoManager = nil
             
         } catch {
             
@@ -62,7 +67,7 @@ struct CoreDataCore {
     func editorContext() -> NSManagedObjectContext {
         
         let moc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
-        moc.parent = parentContext
+        moc.parent = readerContext
         moc.undoManager = nil
         
         return moc
index 42c18fe..3823d60 100644 (file)
@@ -63,7 +63,7 @@ extension CoreDataProvider {
     static func context(for type: CoreDataManagerType) -> NSManagedObjectContext {
         
         switch type {
-        case .reader: return core.parentContext
+        case .reader: return core.readerContext
             
         case .editor: return core.editorContext()
         }
@@ -102,15 +102,32 @@ extension CoreDataProvider {
                 return
             }
             
-            guard let parent = context.parent else { return }
+            guard let reader = context.parent else { return }
             
             // save parent context
             var catchedError: NSError? = nil
-            parent.performAndWait {
+            reader.performAndWait {
                 
                 do {
                     
-                    try parent.save()
+                    try reader.save()
+                    
+                    guard let writer = reader.parent else {
+                        
+                        throw CoreDataError.couldNotSave("Could not get writer context.")
+                    }
+                    
+                    writer.performAndWait {
+                        
+                        do {
+                            
+                            try writer.save()
+                            
+                        } catch let error as NSError {
+                            
+                            catchedError = error
+                        }
+                    }
                     
                 } catch let error as NSError {
                     
index 76668a4..ff7479c 100644 (file)
@@ -120,7 +120,7 @@ final class MOCGenerator {
     
     private func createContext(_ coordinator: NSPersistentStoreCoordinator) -> NSManagedObjectContext {
         
-        let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
+        let moc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
         moc.persistentStoreCoordinator = coordinator
         moc.undoManager = nil