struct CoreDataCore {
let config: CoreDataConfiguration
- let parentContext: NSManagedObjectContext
+ let writerContext: NSManagedObjectContext
+ let readerContext: NSManagedObjectContext
private let model: NSManagedObjectModel
private let coordinator: NSPersistentStoreCoordinator
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 {
func editorContext() -> NSManagedObjectContext {
let moc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
- moc.parent = parentContext
+ moc.parent = readerContext
moc.undoManager = nil
return moc
static func context(for type: CoreDataManagerType) -> NSManagedObjectContext {
switch type {
- case .reader: return core.parentContext
+ case .reader: return core.readerContext
case .editor: return core.editorContext()
}
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 {
private func createContext(_ coordinator: NSPersistentStoreCoordinator) -> NSManagedObjectContext {
- let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
+ let moc = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
moc.persistentStoreCoordinator = coordinator
moc.undoManager = nil