diff --git a/ARCoreDataAction.h b/ARCoreDataAction.h index 6822283..8be990e 100644 --- a/ARCoreDataAction.h +++ b/ARCoreDataAction.h @@ -7,6 +7,7 @@ // #import +#import "NSManagedObjectContext+ActiveRecord.h" typedef enum { @@ -37,5 +38,4 @@ typedef enum #endif - @end diff --git a/ARCoreDataAction.m b/ARCoreDataAction.m index f9ad25d..36a9776 100644 --- a/ARCoreDataAction.m +++ b/ARCoreDataAction.m @@ -7,10 +7,11 @@ // #import "ARCoreDataAction.h" +#import "CoreData+ActiveRecordFetching.h" static dispatch_queue_t coredata_background_save_queue; -dispatch_queue_t background_save_queue() +dispatch_queue_t background_save_queue(void) { if (coredata_background_save_queue == NULL) { @@ -36,8 +37,8 @@ void cleanup_save_queue() #ifdef NS_BLOCKS_AVAILABLE -+ (void) saveDataWithBlock:(void(^)(NSManagedObjectContext *localContext))block -{ ++ (void) saveDataWithBlock:(void (^)(NSManagedObjectContext *localContext))block errorHandler:(void (^)(NSError *))errorHandler +{ NSManagedObjectContext *mainContext = [NSManagedObjectContext defaultContext]; NSManagedObjectContext *localContext = mainContext; @@ -59,13 +60,18 @@ void cleanup_save_queue() if ([localContext hasChanges]) { - [localContext save]; + [localContext saveWithErrorHandler:errorHandler]; } localContext.notifiesMainContextOnSave = NO; [mainContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; } ++ (void) saveDataWithBlock:(void(^)(NSManagedObjectContext *localContext))block +{ + [self saveDataWithBlock:block errorHandler:NULL]; +} + + (void) saveDataInBackgroundWithBlock:(void(^)(NSManagedObjectContext *localContext))block { dispatch_async(background_save_queue(), ^{ @@ -85,16 +91,31 @@ void cleanup_save_queue() }); } ++ (void) saveDataInBackgroundWithBlock:(void (^)(NSManagedObjectContext *localContext))block completion:(void (^)(void))callback errorHandler:(void (^)(NSError *))errorHandler +{ + dispatch_async(background_save_queue(), ^{ + [self saveDataWithBlock:block errorHandler:errorHandler]; + + if (callback) + { + dispatch_async(dispatch_get_main_queue(), callback); + } + }); +} + + (void) lookupWithBlock:(void(^)(NSManagedObjectContext *localContext))block { NSManagedObjectContext *context = [NSManagedObjectContext contextForCurrentThread]; - - block(context); + + if (block) + { + block(context); + } } + (void) saveDataWithOptions:(ARCoreDataSaveOption)options withBlock:(void(^)(NSManagedObjectContext *localContext))block; { - //TODO: add implementation + [self saveDataWithOptions:options withBlock:block completion:NULL]; } + (void) saveDataWithOptions:(ARCoreDataSaveOption)options withBlock:(void(^)(NSManagedObjectContext *localContext))block completion:(void(^)(void))callback; @@ -102,6 +123,11 @@ void cleanup_save_queue() //TODO: add implementation } ++ (void) saveDataWithOptions:(ARCoreDataSaveOption)options withBlock:(void (^)(NSManagedObjectContext *))block completion:(void (^)(void))callback errorHandler:(void(^)(NSError *))errorCallback +{ + +} + #endif @end \ No newline at end of file diff --git a/ActiveRecordHelpers.m b/ActiveRecordHelpers.m index 3ddf439..5e0d932 100644 --- a/ActiveRecordHelpers.m +++ b/ActiveRecordHelpers.m @@ -5,12 +5,7 @@ // Copyright 2010 Magical Panda Software, LLC All rights reserved. // -#import "ActiveRecordHelpers.h" -#import "ARCoreDataAction.h" -#import "NSManagedObjectContext+ActiveRecord.h" -#import "NSPersistentStoreCoordinator+ActiveRecord.h" -#import "NSManagedObjectModel+ActiveRecord.h" -#import "NSPersistentStore+ActiveRecord.h" +#import "CoreData+ActiveRecordFetching.h" #import static id errorHandlerTarget = nil; diff --git a/CoreData+ActiveRecordFetching.h b/CoreData+ActiveRecordFetching.h index 54d7d7e..15d86cb 100644 --- a/CoreData+ActiveRecordFetching.h +++ b/CoreData+ActiveRecordFetching.h @@ -7,11 +7,13 @@ #define ENABLE_ACTIVE_RECORD_LOGGING #ifdef ENABLE_ACTIVE_RECORD_LOGGING - #define ARLog(...) NSLog(@"%s(%x) %@", __PRETTY_FUNCTION__, (unsigned int)self, [NSString stringWithFormat:__VA_ARGS__]) + #define ARLog(...) NSLog(@"%s(%p) %@", __PRETTY_FUNCTION__, self, [NSString stringWithFormat:__VA_ARGS__]) #else #define ARLog(...) ((void)0) #endif +#import + #import "ActiveRecordHelpers.h" #import "ARCoreDataAction.h" #import "NSManagedObject+ActiveRecord.h" diff --git a/NSManagedObject+ActiveRecord.m b/NSManagedObject+ActiveRecord.m index f846f16..c79843f 100644 --- a/NSManagedObject+ActiveRecord.m +++ b/NSManagedObject+ActiveRecord.m @@ -3,10 +3,8 @@ // Copyright 2010 Magical Panda Software, LLC All rights reserved. // -#import #import "NSManagedObject+ActiveRecord.h" -#import "NSManagedObjectContext+ActiveRecord.h" - +#import "CoreData+ActiveRecordFetching.h" static NSUInteger defaultBatchSize = kActiveRecordDefaultBatchSize; @@ -125,10 +123,10 @@ static NSUInteger defaultBatchSize = kActiveRecordDefaultBatchSize; { NSMutableArray *attributes = [NSMutableArray array]; - for (NSString *attributeName in attributesToSortBy) { + for (NSString *attributeName in attributesToSortBy) + { NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:attributeName ascending:ascending]; [attributes addObject:sortDescriptor]; - [sortDescriptor release]; } return attributes; @@ -146,7 +144,7 @@ static NSUInteger defaultBatchSize = kActiveRecordDefaultBatchSize; + (NSFetchRequest *)createFetchRequestInContext:(NSManagedObjectContext *)context { - NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; + NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:[self entityDescriptionInContext:context]]; return request; @@ -293,7 +291,6 @@ static NSUInteger defaultBatchSize = kActiveRecordDefaultBatchSize; NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:sortTerm ascending:ascending]; [request setSortDescriptors:[NSArray arrayWithObject:sortBy]]; - [sortBy release]; return request; } @@ -314,7 +311,6 @@ static NSUInteger defaultBatchSize = kActiveRecordDefaultBatchSize; NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:sortTerm ascending:ascending]; [request setSortDescriptors:[NSArray arrayWithObject:sortBy]]; - [sortBy release]; return request; } @@ -395,7 +391,7 @@ static NSUInteger defaultBatchSize = kActiveRecordDefaultBatchSize; managedObjectContext:context sectionNameKeyPath:group cacheName:cacheName]; - return [controller autorelease]; + return controller; } + (NSFetchedResultsController *) fetchRequestAllGroupedBy:(NSString *)group withPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortTerm ascending:(BOOL)ascending @@ -440,7 +436,7 @@ static NSUInteger defaultBatchSize = kActiveRecordDefaultBatchSize; sectionNameKeyPath:group cacheName:cacheName]; [self performFetch:controller]; - return [controller autorelease]; + return controller; } + (NSFetchedResultsController *) fetchRequest:(NSFetchRequest *)request groupedBy:(NSString *)group @@ -668,15 +664,16 @@ static NSUInteger defaultBatchSize = kActiveRecordDefaultBatchSize; - (id) inContext:(NSManagedObjectContext*)context { NSError *error = nil; - NSManagedObject *inContext = [[context existingObjectWithID:[self objectID] error:&error] retain]; + NSManagedObject *inContext = [context existingObjectWithID:[self objectID] error:&error]; [ActiveRecordHelpers handleErrors:error]; - return [inContext autorelease]; + return inContext; } - (id) inThreadContext { - return [self inContext:[NSManagedObjectContext contextForCurrentThread]]; + __weak NSManagedObject *weakSelf = self; + return [weakSelf inContext:[NSManagedObjectContext contextForCurrentThread]]; } @end \ No newline at end of file diff --git a/NSManagedObjectContext+ActiveRecord.h b/NSManagedObjectContext+ActiveRecord.h index 7828b2c..df940d2 100644 --- a/NSManagedObjectContext+ActiveRecord.h +++ b/NSManagedObjectContext+ActiveRecord.h @@ -14,6 +14,11 @@ - (void) observeContextOnMainThread:(NSManagedObjectContext *)otherContext; - (BOOL) save; + +#ifdef NS_BLOCKS_AVAILABLE +- (BOOL) saveWithErrorHandler:(void(^)(NSError *))errorCallback; +#endif + - (BOOL) saveOnMainThread; - (BOOL) saveOnBackgroundThread; - (void) setNotifiesMainContextOnSave:(BOOL)enabled; @@ -22,9 +27,10 @@ + (NSManagedObjectContext *) defaultContext; + (void) setDefaultContext:(NSManagedObjectContext *)moc; + (void) resetContextForCurrentThread; -+ (NSManagedObjectContext *) contextForCurrentThread; + (NSManagedObjectContext *) context; ++ (NSManagedObjectContext *) contextForCurrentThread; + + (NSManagedObjectContext *) contextThatNotifiesDefaultContextOnMainThread; + (NSManagedObjectContext *) contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:(NSPersistentStoreCoordinator *)coordinator; + (NSManagedObjectContext *) contextWithStoreCoordinator:(NSPersistentStoreCoordinator *)coordinator; diff --git a/NSManagedObjectContext+ActiveRecord.m b/NSManagedObjectContext+ActiveRecord.m index 2a3d440..ad31c1f 100644 --- a/NSManagedObjectContext+ActiveRecord.m +++ b/NSManagedObjectContext+ActiveRecord.m @@ -5,9 +5,7 @@ // Copyright 2010 Magical Panda Software, LLC All rights reserved. // -#import "NSManagedObject+ActiveRecord.h" -#import "NSManagedObjectContext+ActiveRecord.h" -#import "NSPersistentStoreCoordinator+ActiveRecord.h" +#import "CoreData+ActiveRecordFetching.h" #import static NSManagedObjectContext *defaultManageObjectContext = nil; @@ -32,16 +30,17 @@ static NSString const * kActiveRecordManagedObjectContextKey = @"ActiveRecord_NS { if (defaultManageObjectContext != moc) { - [defaultManageObjectContext release]; - defaultManageObjectContext = [moc retain]; + defaultManageObjectContext = moc; } } + (void) resetDefaultContext { - dispatch_sync(dispatch_get_main_queue(), ^{ - [[NSManagedObjectContext defaultContext] reset]; - }); + void (^resetBlock)(void) = ^{ + [[NSManagedObjectContext defaultContext] reset]; + }; + + dispatch_async(dispatch_get_current_queue(), resetBlock); } + (void) resetContextForCurrentThread { @@ -133,7 +132,8 @@ static NSString const * kActiveRecordManagedObjectContextKey = @"ActiveRecord_NS return saved && error == nil; } -- (BOOL) saveWithErrorHandler:(void^(NSError *))errorCallback +#ifdef NS_BLOCKS_AVAILABLE +- (BOOL) saveWithErrorHandler:(void(^)(NSError *))errorCallback { NSError *error = nil; BOOL saved = NO; @@ -157,12 +157,14 @@ static NSString const * kActiveRecordManagedObjectContextKey = @"ActiveRecord_NS } return saved && error == nil; } +#endif - (void) saveWrapper { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [self save]; - [pool drain]; + @autoreleasepool + { + [self save]; + } } - (BOOL) saveOnBackgroundThread @@ -208,7 +210,7 @@ static NSString const * kActiveRecordManagedObjectContextKey = @"ActiveRecord_NS context = [[NSManagedObjectContext alloc] init]; [context setPersistentStoreCoordinator:coordinator]; } - return [context autorelease]; + return context; } + (NSManagedObjectContext *) contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:(NSPersistentStoreCoordinator *)coordinator; diff --git a/NSManagedObjectModel+ActiveRecord.m b/NSManagedObjectModel+ActiveRecord.m index 6fcf908..35dbad4 100644 --- a/NSManagedObjectModel+ActiveRecord.m +++ b/NSManagedObjectModel+ActiveRecord.m @@ -24,13 +24,12 @@ static NSManagedObjectModel *defaultManagedObjectModel = nil; + (void) setDefaultManagedObjectModel:(NSManagedObjectModel *)newDefaultModel { - [defaultManagedObjectModel release]; - defaultManagedObjectModel = [newDefaultModel retain]; + defaultManagedObjectModel = newDefaultModel; } + (NSManagedObjectModel *) newManagedObjectModel { - return [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; + return [NSManagedObjectModel mergedModelFromBundles:nil]; } + (NSManagedObjectModel *) newModelNamed:(NSString *) modelName inBundleNamed:(NSString *) bundleName @@ -54,7 +53,7 @@ static NSManagedObjectModel *defaultManagedObjectModel = nil; + (NSManagedObjectModel *) managedObjectModelNamed:(NSString *)modelFileName { - return [[self newManagedObjectModelNamed:modelFileName] autorelease]; + return [self newManagedObjectModelNamed:modelFileName]; } @end diff --git a/NSPersistentStore+ActiveRecord.m b/NSPersistentStore+ActiveRecord.m index a6aded7..3df8179 100644 --- a/NSPersistentStore+ActiveRecord.m +++ b/NSPersistentStore+ActiveRecord.m @@ -18,8 +18,7 @@ static NSPersistentStore *defaultPersistentStore = nil; + (void) setDefaultPersistentStore:(NSPersistentStore *) store { - [defaultPersistentStore release]; - defaultPersistentStore = [store retain]; + defaultPersistentStore = store; //#ifdef UIKIT_EXTERN_CLASS // if (store == nil) @@ -49,7 +48,7 @@ static NSPersistentStore *defaultPersistentStore = nil; + (NSURL *) urlForStoreName:(NSString *)storeFileName { NSArray *paths = [NSArray arrayWithObjects:[self applicationDocumentsDirectory], [self applicationLibraryDirectory], nil]; - NSFileManager *fm = [[[NSFileManager alloc] init] autorelease]; + NSFileManager *fm = [[NSFileManager alloc] init]; for (NSString *path in paths) { diff --git a/NSPersistentStoreCoordinator+ActiveRecord.m b/NSPersistentStoreCoordinator+ActiveRecord.m index b9a1e48..f43d0f6 100644 --- a/NSPersistentStoreCoordinator+ActiveRecord.m +++ b/NSPersistentStoreCoordinator+ActiveRecord.m @@ -27,8 +27,7 @@ static NSPersistentStoreCoordinator *defaultCoordinator = nil; + (void) setDefaultStoreCoordinator:(NSPersistentStoreCoordinator *)coordinator { - [defaultCoordinator release]; - defaultCoordinator = [coordinator retain]; + defaultCoordinator = coordinator; } - (void) setupSqliteStoreNamed:(id)storeFileName withOptions:(NSDictionary *)options @@ -54,7 +53,7 @@ static NSPersistentStoreCoordinator *defaultCoordinator = nil; [psc setupSqliteStoreNamed:[persistentStore URL] withOptions:nil]; - return [psc autorelease]; + return psc; } + (NSPersistentStoreCoordinator *) coordinatorWithSqliteStoreNamed:(NSString *)storeFileName withOptions:(NSDictionary *)options @@ -64,7 +63,7 @@ static NSPersistentStoreCoordinator *defaultCoordinator = nil; [psc setupSqliteStoreNamed:storeFileName withOptions:options]; - return [psc autorelease]; + return psc; } + (NSPersistentStoreCoordinator *) coordinatorWithSqliteStoreNamed:(NSString *)storeFileName @@ -94,7 +93,7 @@ static NSPersistentStoreCoordinator *defaultCoordinator = nil; { [coordinator performSelector:@selector(setupAutoMigratingSqliteStoreNamed:) withObject:storeFileName afterDelay:0.5]; } - return [coordinator autorelease]; + return coordinator; } + (NSPersistentStoreCoordinator *) coordinatorWithInMemoryStore @@ -103,7 +102,7 @@ static NSPersistentStoreCoordinator *defaultCoordinator = nil; NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; [NSPersistentStore setDefaultPersistentStore:[psc addInMemoryStore]]; - return [psc autorelease]; + return psc; } - (NSPersistentStore *) addInMemoryStore @@ -123,7 +122,7 @@ static NSPersistentStoreCoordinator *defaultCoordinator = nil; + (NSPersistentStoreCoordinator *) newPersistentStoreCoordinator { - return [[self coordinatorWithSqliteStoreNamed:kActiveRecordDefaultStoreFileName] retain]; + return [self coordinatorWithSqliteStoreNamed:kActiveRecordDefaultStoreFileName]; } @end