Skip to content

Instantly share code, notes, and snippets.

@michael-mckenna
Last active June 29, 2020 03:45
Show Gist options
  • Save michael-mckenna/95aa876997315bcdd85dc1337677985e to your computer and use it in GitHub Desktop.
Save michael-mckenna/95aa876997315bcdd85dc1337677985e to your computer and use it in GitHub Desktop.
Concurrency Core Data Stack
class CoreDataHelper {
// MARK: - Core Data Stack
lazy var applicationDocumentsDirectory: URL = {
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return urls[urls.count-1]
}()
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = Bundle.main.url(forResource: "app_name", withExtension: "momd")!
return NSManagedObjectModel(contentsOf: modelURL)!
}()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
var coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite")
let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
do {
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options)
} catch {
print(erorr)
}
return coordinator
}()
lazy var mainObjectContext: NSManagedObjectContext = {
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
// set the coordinator
managedObjectContext.persistentStoreCoordinator = coordinator
// This policy discards in-memory state changes for objects in conflict.
// The persistent store’s version of the objects’ state is used
managedObjectContext.mergePolicy = NSRollbackMergePolicy
return managedObjectContext
}()
/// Creates a new private context from the current state of `managedObjectContext`
func generatePrivateContext() -> NSManagedObjectContext {
// Initialize Managed Object Context
let managedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
// Configure Managed Object Context
managedObjectContext.parent = self.managedObjectContext
return managedObjectContext
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment