2 // ManagedObjectContextGenerator.swift
5 // Created by Hori,Masaki on 2017/03/21.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 enum CoreDataError: Error {
12 case applicationDirectoryIsFile
13 case couldNotCreateModel
14 case couldNotCreateCoordinator(String)
17 func remove(name: String) {
20 .map { ApplicationDirecrories.support.appendingPathComponent($0) }
21 .forEach { removeDataFile(at: $0) }
24 func genarate(_ config: CoreDataConfiguration) throws ->
25 (model: NSManagedObjectModel, coordinator: NSPersistentStoreCoordinator, moc: NSManagedObjectContext) {
27 let model = try createModel(config)
28 let coordinator = try getCoordinator(config, model)
29 let moc = createContext(coordinator)
30 return (model: model, coordinator: coordinator, moc: moc)
36 private func removeDataFile(at url: URL) {
38 try FileManager.default.removeItem(at: url)
40 print("Could not remove file for URL (\(url))")
44 // MARK: - NSManagedObjectContext and ...
45 private func createModel(_ config: CoreDataConfiguration) throws -> NSManagedObjectModel {
46 guard let modelURL = Bundle.main.url(forResource: config.modelName, withExtension: "momd"),
47 let model = NSManagedObjectModel(contentsOf: modelURL)
49 throw CoreDataError.couldNotCreateModel
53 private func getCoordinator(_ config: CoreDataConfiguration,
54 _ model: NSManagedObjectModel) throws -> NSPersistentStoreCoordinator {
56 return try createCoordinator(config, model)
58 let nserror = error as NSError
59 // Data Modelが更新されていたらストアファイルを削除してもう一度
60 if nserror.domain == NSCocoaErrorDomain,
61 (nserror.code == 134130 || nserror.code == 134110),
63 remove(name: config.fileName)
65 return try createCoordinator(config, model)
67 print("Fail crrate NSPersistentStoreCoordinator twice.")
73 private func createCoordinator(_ config: CoreDataConfiguration,
74 _ model: NSManagedObjectModel) throws -> NSPersistentStoreCoordinator {
75 if !checkDirectory(ApplicationDirecrories.support) {
76 let failureReason = "Can not use directory \(ApplicationDirecrories.support.path)"
77 throw CoreDataError.couldNotCreateCoordinator(failureReason)
80 let coordinator: NSPersistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
81 let url = ApplicationDirecrories.support.appendingPathComponent(config.fileName)
83 try coordinator.addPersistentStore(ofType: config.type,
84 configurationName: nil,
86 options: config.options)
92 private func createContext(_ coordinator: NSPersistentStoreCoordinator) -> NSManagedObjectContext {
93 let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
94 moc.persistentStoreCoordinator = coordinator