From b4920759628ea68cd1a6f4b5738ad264652bbc31 Mon Sep 17 00:00:00 2001 From: masakih Date: Tue, 13 Mar 2018 00:03:38 +0900 Subject: [PATCH] =?utf8?q?=E4=BF=9D=E5=AD=98=E7=94=A8NSManagedObjectContex?= =?utf8?q?t=E3=82=92=E7=94=A8=E3=81=84=E3=81=84=E3=82=8B=E3=82=88=E3=81=86?= =?utf8?q?=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- KCD/CoreDataCore.swift | 11 ++++++++--- KCD/CoreDataManager.swift | 25 +++++++++++++++++++++---- KCD/MOCGenerator.swift | 2 +- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/KCD/CoreDataCore.swift b/KCD/CoreDataCore.swift index 0bfe647c..d9b08e34 100644 --- a/KCD/CoreDataCore.swift +++ b/KCD/CoreDataCore.swift @@ -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 diff --git a/KCD/CoreDataManager.swift b/KCD/CoreDataManager.swift index 42c18fe1..3823d600 100644 --- a/KCD/CoreDataManager.swift +++ b/KCD/CoreDataManager.swift @@ -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 { diff --git a/KCD/MOCGenerator.swift b/KCD/MOCGenerator.swift index 76668a41..ff7479c0 100644 --- a/KCD/MOCGenerator.swift +++ b/KCD/MOCGenerator.swift @@ -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 -- 2.11.0