Create a new PSC for every background thread (optional via compile constant)

This commit is contained in:
Saul Mora
2010-12-08 14:38:00 -07:00
parent dc6ab2c5bf
commit dfd2ec4e5a
8 changed files with 74 additions and 14 deletions

View File

@@ -8,9 +8,6 @@
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
// enable to use caches for the fetchedResultsControllers (iOS only)
// #define STORE_USE_CACHE
#ifdef NS_BLOCKS_AVAILABLE
@class NSManagedObjectContext;

View File

@@ -20,6 +20,10 @@
[NSManagedObjectModel setDefaultManagedObjectModel:nil];
[NSPersistentStoreCoordinator setDefaultStoreCoordinator:nil];
[NSPersistentStore setDetaultPersistentStore:nil];
//#ifdef NS_BLOCKS_AVAILABLE
// [self setBackgroundCoordinator:nil];
//#endif
}
+ (void) handleErrors:(NSError *)error
@@ -100,12 +104,22 @@
+ (void) performSaveDataOperationWithBlock:(CoreDataBlock)block
{
NSManagedObjectContext *localContext = [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread];
// if (![NSThread isMainThread])
// {
// [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread];
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:NSMergeByPropertyObjectTrumpMergePolicy];
// }
}
block(localContext);
@@ -113,7 +127,9 @@
{
[localContext save];
}
[[NSManagedObjectContext defaultContext] stopObservingContext:localContext];
localContext.notifiesMainContextOnSave = NO;
[mainContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
}
+ (void) performSaveDataOperationInBackgroundWithBlock:(CoreDataBlock)block

View File

@@ -1,4 +1,8 @@
// enable to use caches for the fetchedResultsControllers (iOS only)
// #define STORE_USE_CACHE
#define kCreateNewCoordinatorOnBackgroundOperations 1
#import "ActiveRecordHelpers.h"
#import "NSManagedObject+ActiveRecord.h"
#import "NSManagedObjectContext+ActiveRecord.h"

View File

@@ -371,7 +371,7 @@ static NSNumber *defaultBatchSize = nil;
{
NSString *cacheName = nil;
#ifdef STORE_USE_CACHE
cacheName = [NSString stringWithFormat:@"cache-%@", NSStringFromClass(self)];
cacheName = [NSString stringWithFormat:@"ActiveRecord-Cache-%@", NSStringFromClass(self)];
#endif
NSFetchRequest *request = [self requestAllSortedBy:sortTerm
@@ -420,7 +420,7 @@ static NSNumber *defaultBatchSize = nil;
{
NSString *cacheName = nil;
#ifdef STORE_USE_CACHE
cacheName = [NSString stringWithFormat:@"cache-%@", NSStringFromClass([self class])];
cacheName = [NSString stringWithFormat:@"ActiveRecord-Cache-%@", NSStringFromClass([self class])];
#endif
NSFetchedResultsController *controller =
[[NSFetchedResultsController alloc] initWithFetchRequest:request

View File

@@ -16,6 +16,7 @@
- (BOOL) save;
- (BOOL) saveOnMainThread;
- (BOOL) saveOnBackgroundThread;
- (void) setNotifiesMainContextOnSave:(BOOL)enabled;
+ (void) resetDefaultContext;
+ (NSManagedObjectContext *) defaultContext;
@@ -24,6 +25,9 @@
+ (NSManagedObjectContext *) context;
+ (NSManagedObjectContext *) contextThatNotifiesDefaultContextOnMainThread;
+ (NSManagedObjectContext *) contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:(NSPersistentStoreCoordinator *)coordinator;
+ (NSManagedObjectContext *) contextWithStoreCoordinator:(NSPersistentStoreCoordinator *)coordinator;
@property (nonatomic, assign) BOOL notifiesMainContextOnSave;
@end

View File

@@ -8,6 +8,7 @@
#import "NSManagedObject+ActiveRecord.h"
#import "NSManagedObjectContext+ActiveRecord.h"
#import "NSPersistentStoreCoordinator+ActiveRecord.h"
#import <objc/runtime.h>
static NSManagedObjectContext *defaultManageObjectContext = nil;
@@ -147,6 +148,23 @@ static NSManagedObjectContext *defaultManageObjectContext = nil;
return YES;
}
- (BOOL) notifiesMainContextOnSave
{
NSNumber *notifies = objc_getAssociatedObject(self, @"notifiesMainContext");
return notifies ? [notifies boolValue] : NO;
}
- (void) setNotifiesMainContextOnSave:(BOOL)enabled
{
NSManagedObjectContext *mainContext = [[self class] defaultContext];
if (self != mainContext)
{
SEL selector = enabled ? @selector(observeContextOnMainThread:) : @selector(stopObservingContext:);
objc_setAssociatedObject(self, @"notifiesMainContext", [NSNumber numberWithBool:enabled], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[mainContext performSelector:selector withObject:self];
}
}
+ (NSManagedObjectContext *) contextWithStoreCoordinator:(NSPersistentStoreCoordinator *)coordinator
{
NSManagedObjectContext *context = nil;
@@ -158,6 +176,14 @@ static NSManagedObjectContext *defaultManageObjectContext = nil;
return [context autorelease];
}
+ (NSManagedObjectContext *) contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
NSManagedObjectContext *context = [self contextWithStoreCoordinator:coordinator];
// [[self defaultContext] observeContext:context];
context.notifiesMainContextOnSave = YES;
return context;
}
+ (NSManagedObjectContext *) context
{
return [self contextWithStoreCoordinator:[NSPersistentStoreCoordinator defaultStoreCoordinator]];
@@ -166,7 +192,8 @@ static NSManagedObjectContext *defaultManageObjectContext = nil;
+ (NSManagedObjectContext *) contextThatNotifiesDefaultContextOnMainThread
{
NSManagedObjectContext *context = [self context];
[[self defaultContext] observeContextOnMainThread:context];
// [[self defaultContext] observeContextOnMainThread:context];
context.notifiesMainContextOnSave = YES;
return context;
}

View File

@@ -20,6 +20,7 @@
+ (NSPersistentStoreCoordinator *) coordinatorWithSqliteStoreNamed:(NSString *)storeFileName;
+ (NSPersistentStoreCoordinator *) coordinatorWithAutoMigratingSqliteStoreNamed:(NSString *) storeFileName;
+ (NSPersistentStoreCoordinator *) coordinatorWithPersitentStore:(NSPersistentStore *)persistentStore;
- (NSPersistentStore *) addInMemoryStore;

View File

@@ -31,12 +31,13 @@ static NSPersistentStoreCoordinator *defaultCoordinator = nil;
defaultCoordinator = [coordinator retain];
}
- (void) setupSqliteStoreNamed:(NSString *)storeFileName withOptions:(NSDictionary *)options
- (void) setupSqliteStoreNamed:(id)storeFileName withOptions:(NSDictionary *)options
{
NSURL *url = [storeFileName isKindOfClass:[NSURL class]] ? storeFileName : [NSPersistentStore urlForStoreName:storeFileName];
NSError *error = nil;
NSPersistentStore *store = [self addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:[NSPersistentStore urlForStoreName:storeFileName]
URL:url
options:options
error:&error];
if (!store)
@@ -46,6 +47,16 @@ static NSPersistentStoreCoordinator *defaultCoordinator = nil;
[NSPersistentStore setDetaultPersistentStore:store];
}
+ (NSPersistentStoreCoordinator *) coordinatorWithPersitentStore:(NSPersistentStore *)persistentStore;
{
NSManagedObjectModel *model = [NSManagedObjectModel defaultManagedObjectModel];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
[psc setupSqliteStoreNamed:[persistentStore URL] withOptions:nil];
return [psc autorelease];
}
+ (NSPersistentStoreCoordinator *) coordinatorWithSqliteStoreNamed:(NSString *)storeFileName withOptions:(NSDictionary *)options
{
NSManagedObjectModel *model = [NSManagedObjectModel defaultManagedObjectModel];