// // ClassicSQLiteMagicalRecordStack.m // MagicalRecord // // Created by Saul Mora on 10/21/13. // Copyright (c) 2013 Magical Panda Software LLC. All rights reserved. // #import "ClassicSQLiteMagicalRecordStack.h" #import "MagicalRecordStack+Actions.h" #import "NSManagedObjectContext+MagicalObserving.h" #import "MagicalRecordLogging.h" @implementation ClassicSQLiteMagicalRecordStack - (NSManagedObjectContext *)newConfinementContext; { NSManagedObjectContext *context = [NSManagedObjectContext MR_confinementContext]; [context setPersistentStoreCoordinator:self.coordinator]; [context setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; //TODO: This observation needs to be torn down by the user at this time :( [self.context MR_observeContextDidSave:context]; return context; } /* - (void) saveWithBlock:(void (^)(NSManagedObjectContext *))block identifier:(NSString *)contextWorkingName completion:(MRSaveCompletionHandler)completion; { NSParameterAssert(block); MRLogVerbose(@"Dispatching save request: %@", contextWorkingName); dispatch_async(MR_saveQueue(), ^{ MRLogVerbose(@"%@ save starting", contextWorkingName); NSManagedObjectContext *localContext = [self newConfinementContext]; NSManagedObjectContext *mainContext = [self context]; [mainContext MR_observeContextDidSave:localContext]; [mainContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; [localContext MR_setWorkingName:contextWorkingName]; block(localContext); [localContext MR_saveWithOptions:MRSaveSynchronously completion:completion]; [mainContext MR_stopObservingContextDidSave:localContext]; }); } */ - (BOOL) saveWithBlock:(void (^)(NSManagedObjectContext *))block identifier:(NSString *)contextWorkingName wait:(BOOL)shouldWait error:(NSError **)error completion:(MRSaveCompletionHandler)completion; { NSParameterAssert(block); MRLogVerbose(@"Dispatching save request: %@", contextWorkingName); // dispatch_async(MR_saveQueue(), BOOL (^saveBlock)(BOOL, NSError **, MRSaveCompletionHandler) = ^BOOL(BOOL synchronous, NSError **anError, MRSaveCompletionHandler cHandler){ @autoreleasepool { MRLogVerbose(@"%@ save starting", contextWorkingName); NSManagedObjectContext *localContext = [self newConfinementContext]; NSManagedObjectContext *mainContext = [self context]; [mainContext MR_observeContextDidSave:localContext]; [mainContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; if (nil != contextWorkingName) [localContext MR_setWorkingName:contextWorkingName]; block(localContext); if (shouldWait && NO == [localContext hasChanges]) { MRLogInfo(@"NO CHANGES IN ** %@ ** CONTEXT - NOT SAVING", [localContext MR_workingName]); [mainContext MR_stopObservingContextDidSave:localContext]; return YES; } MRSaveCompletionHandler completionHandler = cHandler; __block BOOL saveSuccess = YES; if (shouldWait) { completionHandler = ^(BOOL localSuccess, NSError *localSaveError){ if (nil != completion) cHandler(localSuccess, localSaveError); saveSuccess = localSuccess; if (anError != nil) { *anError = localSaveError; } }; } [localContext MR_saveWithOptions:MRSaveParentContexts|MRSaveSynchronously completion:completionHandler]; [mainContext MR_stopObservingContextDidSave:localContext]; return saveSuccess; } }; BOOL returnValue = YES; if (shouldWait) returnValue = saveBlock(shouldWait, error, nil); else { dispatch_async(MR_saveQueue(), ^{ saveBlock(shouldWait, error, completion); }); } return returnValue; } @end