Automatically saves to disk when saving managed object context

This commit is contained in:
Riley Testut 2015-11-14 19:38:26 -08:00
parent 3dcf6b9df0
commit 4a2b5cd1dd
3 changed files with 73 additions and 40 deletions

View File

@ -66,6 +66,7 @@ class DatabaseManager
}
private let privateManagedObjectContext: NSManagedObjectContext
private let validationManagedObjectContext: NSManagedObjectContext
// MARK: - Initialization -
/// Initialization
@ -83,6 +84,12 @@ class DatabaseManager
self.managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
self.managedObjectContext.parentContext = self.privateManagedObjectContext
self.managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
self.validationManagedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
self.validationManagedObjectContext.parentContext = self.managedObjectContext
self.validationManagedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("managedObjectContextDidSave:"), name: NSManagedObjectContextDidSaveNotification, object: nil)
}
func startWithCompletion(completionBlock: ((performingMigration: Bool) -> Void)?)
@ -126,42 +133,6 @@ class DatabaseManager
}
}
// MARK: - Saving -
/// Saving
func save()
{
let backgroundTaskIdentifier = RSTBeginBackgroundTask("Save Database Task")
self.managedObjectContext.performBlockAndWait() {
do
{
try self.managedObjectContext.save()
}
catch let error as NSError
{
print("Failed to save main context:", error)
}
self.privateManagedObjectContext.performBlock() {
do
{
try self.privateManagedObjectContext.save()
}
catch let error as NSError
{
print("Failed to save private context to disk:", error)
}
RSTEndBackgroundTask(backgroundTaskIdentifier)
}
}
}
// MARK: - Importing -
/// Importing
@ -231,16 +202,80 @@ class DatabaseManager
}
// MARK: - Background Contexts -
/// Background Contexts
func backgroundManagedObjectContext() -> NSManagedObjectContext
{
let managedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
managedObjectContext.parentContext = self.managedObjectContext
managedObjectContext.parentContext = self.validationManagedObjectContext
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
return managedObjectContext
}
}
private extension DatabaseManager
{
// MARK: - Saving -
private func save()
{
let backgroundTaskIdentifier = RSTBeginBackgroundTask("Save Database Task")
self.validationManagedObjectContext.performBlockAndWait {
do
{
try self.validationManagedObjectContext.save()
}
catch let error as NSError
{
print("Failed to save validation context:", error)
}
// Update main managed object context
self.managedObjectContext.performBlockAndWait() {
do
{
try self.managedObjectContext.save()
}
catch let error as NSError
{
print("Failed to save main context:", error)
}
// Save to disk
self.privateManagedObjectContext.performBlock() {
do
{
try self.privateManagedObjectContext.save()
}
catch let error as NSError
{
print("Failed to save private context to disk:", error)
}
RSTEndBackgroundTask(backgroundTaskIdentifier)
}
}
}
}
// MARK: - Notifications -
dynamic func managedObjectContextDidSave(notification: NSNotification)
{
guard let managedObjectContext = notification.object as? NSManagedObjectContext where managedObjectContext.parentContext == self.validationManagedObjectContext else { return }
self.save()
}
}

View File

@ -77,7 +77,6 @@ extension GamesViewController: GamePickerControllerDelegate
{
func gamePickerController(gamePickerController: GamePickerController, didImportGames games: [Game])
{
DatabaseManager.sharedManager.save()
print(games)
}
}

View File

@ -88,7 +88,6 @@ extension GameSelectionViewController: GamePickerControllerDelegate
{
func gamePickerController(gamePickerController: GamePickerController, didImportGames games: [Game])
{
DatabaseManager.sharedManager.save()
print(games)
}
}