mirror of
https://github.com/zhigang1992/MagicalRecord.git
synced 2026-01-12 17:32:18 +08:00
Moving block helpers into another class
This commit is contained in:
25
ARCoreDataAction.h
Normal file
25
ARCoreDataAction.h
Normal 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
84
ARCoreDataAction.m
Normal 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
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user