Moving block helpers into another class

This commit is contained in:
Saul Mora
2011-04-19 17:34:42 -06:00
parent f2640001a8
commit 89d2e38370
6 changed files with 128 additions and 52 deletions

25
ARCoreDataAction.h Normal file
View File

@@ -0,0 +1,25 @@
//
// ARCoreDataAction.h
// Freshpod
//
// Created by Saul Mora on 2/24/11.
// Copyright 2011 Magical Panda Software. All rights reserved.
//
#import <Foundation/Foundation.h>
@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

84
ARCoreDataAction.m Normal file
View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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"

View File

@@ -11,6 +11,7 @@
#import <objc/runtime.h>
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;
}