mirror of
https://github.com/zhigang1992/MagicalRecord.git
synced 2026-01-12 22:48:38 +08:00
Create a new PSC for every background thread (optional via compile constant)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
+ (NSPersistentStoreCoordinator *) coordinatorWithSqliteStoreNamed:(NSString *)storeFileName;
|
||||
+ (NSPersistentStoreCoordinator *) coordinatorWithAutoMigratingSqliteStoreNamed:(NSString *) storeFileName;
|
||||
+ (NSPersistentStoreCoordinator *) coordinatorWithPersitentStore:(NSPersistentStore *)persistentStore;
|
||||
|
||||
- (NSPersistentStore *) addInMemoryStore;
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user