From 89d2e38370baf87b32b469395d55e7f0fb2acff3 Mon Sep 17 00:00:00 2001 From: Saul Mora Date: Tue, 19 Apr 2011 17:34:42 -0600 Subject: [PATCH] Moving block helpers into another class --- ARCoreDataAction.h | 25 ++++++++ ARCoreDataAction.m | 84 +++++++++++++++++++++++++++ ActiveRecordHelpers.h | 1 + ActiveRecordHelpers.m | 57 ++++-------------- CoreData+ActiveRecordFetching.h | 5 +- NSManagedObjectContext+ActiveRecord.m | 8 +-- 6 files changed, 128 insertions(+), 52 deletions(-) create mode 100644 ARCoreDataAction.h create mode 100644 ARCoreDataAction.m diff --git a/ARCoreDataAction.h b/ARCoreDataAction.h new file mode 100644 index 0000000..d5fb05a --- /dev/null +++ b/ARCoreDataAction.h @@ -0,0 +1,25 @@ +// +// ARCoreDataAction.h +// Freshpod +// +// Created by Saul Mora on 2/24/11. +// Copyright 2011 Magical Panda Software. All rights reserved. +// + +#import + + +@interface ARCoreDataAction : NSObject {} + +#ifdef NS_BLOCKS_AVAILABLE + ++ (void) saveDataWithBlock:(void(^)(NSManagedObjectContext *localContext))block; ++ (void) saveDataInBackgroundWithBlock:(void(^)(NSManagedObjectContext *localContext))block; ++ (void) saveDataInBackgroundWithBlock:(void(^)(NSManagedObjectContext *localContext))block completion:(void(^)(void))callback; + ++ (void) lookupWithBlock:(void(^)(NSManagedObjectContext *localContext))block; + +#endif + + +@end diff --git a/ARCoreDataAction.m b/ARCoreDataAction.m new file mode 100644 index 0000000..89d44c1 --- /dev/null +++ b/ARCoreDataAction.m @@ -0,0 +1,84 @@ +// +// ARCoreDataAction.m +// Freshpod +// +// Created by Saul Mora on 2/24/11. +// Copyright 2011 Magical Panda Software. All rights reserved. +// + +#import "ARCoreDataAction.h" + +static dispatch_queue_t coredata_background_save_queue; + +dispatch_queue_t background_save_queue() +{ + if (coredata_background_save_queue == NULL) + { + coredata_background_save_queue = dispatch_queue_create("com.doubleencore.coredata.backgroundsaves", 0); + } + return coredata_background_save_queue; +} + +@implementation ARCoreDataAction + +#ifdef NS_BLOCKS_AVAILABLE + ++ (void) saveDataWithBlock:(CoreDataBlock)block +{ + NSManagedObjectContext *mainContext = [NSManagedObjectContext defaultContext]; + NSManagedObjectContext *localContext = mainContext; + + if (![NSThread isMainThread]) + { + +#if kCreateNewCoordinatorOnBackgroundOperations == 1 + NSPersistentStoreCoordinator *localCoordinator = [NSPersistentStoreCoordinator coordinatorWithPersitentStore:[NSPersistentStore defaultPersistentStore]]; + localContext = [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:localCoordinator]; +#else + localContext = [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread]; +#endif + + [mainContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; + [localContext setMergePolicy:NSOverwriteMergePolicy]; + } + + block(localContext); + + if ([localContext hasChanges]) + { + [localContext save]; + } + + localContext.notifiesMainContextOnSave = NO; + [mainContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; +} + ++ (void) saveDataInBackgroundWithBlock:(CoreDataBlock)block +{ + dispatch_async(background_save_queue(), ^{ + [self saveDataWithBlock:block]; + }); +} + ++ (void) saveDataInBackgroundWithBlock:(CoreDataBlock)block completion:(void(^)(void))callback +{ + dispatch_async(background_save_queue(), ^{ + [self saveDataWithBlock:block]; + + if (callback) + { + dispatch_async(dispatch_get_main_queue(), callback); + } + }); +} + ++ (void) lookupWithBlock:(CoreDataBlock)block +{ + NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread]; + + block(context); +} + +#endif + +@end \ No newline at end of file diff --git a/ActiveRecordHelpers.h b/ActiveRecordHelpers.h index 66395f5..cc0023c 100644 --- a/ActiveRecordHelpers.h +++ b/ActiveRecordHelpers.h @@ -32,6 +32,7 @@ typedef void (^CoreDataBlock)(NSManagedObjectContext *); + (void) setupCoreDataStackWithAutoMigratingSqliteStoreNamed:(NSString *)storeName; #ifdef NS_BLOCKS_AVAILABLE +#pragma mark DEPRECATED_METHOD + (void) performSaveDataOperationWithBlock:(CoreDataBlock)block; + (void) performSaveDataOperationInBackgroundWithBlock:(CoreDataBlock)block; diff --git a/ActiveRecordHelpers.m b/ActiveRecordHelpers.m index eef0891..28744cb 100644 --- a/ActiveRecordHelpers.m +++ b/ActiveRecordHelpers.m @@ -97,63 +97,26 @@ } #ifdef NS_BLOCKS_AVAILABLE +#pragma mark DEPRECATED_METHOD -+ (void) performSaveDataOperationWithBlock:(CoreDataBlock)block -{ - NSManagedObjectContext *mainContext = [NSManagedObjectContext defaultContext]; - NSManagedObjectContext *localContext = mainContext; - - if (![NSThread isMainThread]) - { - -#if kCreateNewCoordinatorOnBackgroundOperations == 1 - NSPersistentStoreCoordinator *localCoordinator = [NSPersistentStoreCoordinator coordinatorWithPersitentStore:[NSPersistentStore defaultPersistentStore]]; - localContext = [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:localCoordinator]; -#else - localContext = [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread]; -#endif - - [mainContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; - [localContext setMergePolicy:NSOverwriteMergePolicy]; - } - - block(localContext); - - if ([localContext hasChanges]) - { - [localContext save]; - } - - localContext.notifiesMainContextOnSave = NO; - [mainContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; ++ (void) performSaveDataOperationWithBlock:(CoreDataBlock)block; +{ + [ARCoreDataAction saveDataWithBlock:block]; } -+ (void) performSaveDataOperationInBackgroundWithBlock:(CoreDataBlock)block ++ (void) performSaveDataOperationInBackgroundWithBlock:(CoreDataBlock)block; { - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(queue, ^{ - [self performSaveDataOperationWithBlock:block]; - }); + [ARCoreDataAction saveDataWithBlock:block]; } -+ (void) performSaveDataOperationInBackgroundWithBlock:(CoreDataBlock)block completion:(void(^)(void))callback ++ (void) performLookupOperationWithBlock:(CoreDataBlock)block; { - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(queue, ^{ - [self performSaveDataOperationWithBlock:block]; - - if (callback) - { - dispatch_async(dispatch_get_main_queue(), callback); - } - }); + [ARCoreDataAction lookupWithBlock:block]; } -+ (void) performLookupOperationWithBlock:(CoreDataBlock)block ++ (void) performSaveDataOperationInBackgroundWithBlock:(CoreDataBlock)block completion:(void(^)(void))callback; { - NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread]; - - block(context); + [ARCoreDataAction saveDataInBackgroundWithBlock:block completion:callback]; } #endif diff --git a/CoreData+ActiveRecordFetching.h b/CoreData+ActiveRecordFetching.h index 27c49c0..1e4241b 100644 --- a/CoreData+ActiveRecordFetching.h +++ b/CoreData+ActiveRecordFetching.h @@ -4,13 +4,16 @@ #define kCreateNewCoordinatorOnBackgroundOperations 0 +#define ENABLE_ACTIVE_RECORD_LOGGING + #ifdef ENABLE_ACTIVE_RECORD_LOGGING - #define ARLog(...) NSLog(@"%s(%x) %@", __PRETTY_FUNCTION__, self, [NSString stringWithFormat:__VA_ARGS__]) + #define ARLog(...) NSLog(@"%s(%x) %@", __PRETTY_FUNCTION__, (int)self, [NSString stringWithFormat:__VA_ARGS__]) #else #define ARLog(...) ((void)0) #endif #import "ActiveRecordHelpers.h" +#import "ARCoreDataAction.h" #import "NSManagedObject+ActiveRecord.h" #import "NSManagedObjectContext+ActiveRecord.h" #import "NSPersistentStoreCoordinator+ActiveRecord.h" diff --git a/NSManagedObjectContext+ActiveRecord.m b/NSManagedObjectContext+ActiveRecord.m index 7e0dab2..69b0874 100644 --- a/NSManagedObjectContext+ActiveRecord.m +++ b/NSManagedObjectContext+ActiveRecord.m @@ -11,6 +11,7 @@ #import static NSManagedObjectContext *defaultManageObjectContext = nil; +static NSString const * kActiveRecordManagedObjectContextKey = @"ActiveRecord_NSManagedObjectContextForThreadKey"; @implementation NSManagedObjectContext (ActiveRecord) @@ -49,12 +50,11 @@ static NSManagedObjectContext *defaultManageObjectContext = nil; else { NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary]; - NSManagedObjectContext *threadContext = [threadDict objectForKey:@"MO_Context"]; + NSManagedObjectContext *threadContext = [threadDict objectForKey:kActiveRecordManagedObjectContextKey]; if ( threadContext == nil ) { - threadContext = [self context]; - [threadDict setObject:threadContext forKey:@"MO_Context"]; - //[threadContext release]; + threadContext = [self contextThatNotifiesDefaultContextOnMainThread]; + [threadDict setObject:threadContext forKey:kActiveRecordManagedObjectContextKey]; } return threadContext; }