Created
August 10, 2018 08:40
-
-
Save Viveron/c339fd8ad584b99e93e79476642413a2 to your computer and use it in GitHub Desktop.
NSManagedObjectContext helpful additions for async request execution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <CoreData/CoreData.h> | |
@interface NSManagedObjectContext (AsyncExecute) | |
- (void)asyncExecuteFetchRequest:(NSFetchRequest *)request | |
completion:(void (^)(NSArray *objects, NSError *error))completion; | |
- (void)asyncCountForFetchRequest:(NSFetchRequest *)request | |
completion:(void (^)(NSInteger count, NSError *error))completion; | |
- (void)asyncExecuteBlockInBackgroundContext:(void (^)(NSManagedObjectContext *backgroundContext))block; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import "NSManagedObjectContext+AsyncExecute.h" | |
@implementation NSManagedObjectContext (AsyncExecute) | |
- (void)asyncExecuteFetchRequest:(NSFetchRequest *)request | |
completion:(void (^)(NSArray *objects, NSError *error))completion { | |
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator; | |
NSFetchRequestResultType resultType = [request resultType]; | |
NSManagedObjectContext *backgroundContext = [NSManagedObjectContext privateQueueManagedObjectContext]; | |
[backgroundContext performBlock:^{ | |
backgroundContext.persistentStoreCoordinator = coordinator; | |
NSError *error = nil; | |
NSArray *fetchedObjects = [backgroundContext executeFetchRequest:request error:&error]; | |
[self performBlock:^{ | |
if (resultType == NSManagedObjectResultType && fetchedObjects) { | |
NSArray *objectIds = [fetchedObjects valueForKey:@"objectID"]; | |
NSMutableArray *objects = [[NSMutableArray alloc] initWithCapacity:[objectIds count]]; | |
for (NSManagedObjectID * objectID in objectIds) { | |
NSManagedObject * obj = [self objectWithID:objectID]; | |
[objects addObject:obj]; | |
} | |
if (completion) { | |
completion([objects copy], nil); | |
} | |
} | |
else { | |
if (completion) { | |
completion(fetchedObjects, error); | |
} | |
} | |
}]; | |
}]; | |
} | |
- (void)asyncCountForFetchRequest:(NSFetchRequest *)request | |
completion:(void (^)(NSInteger count, NSError *error))completion { | |
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator; | |
NSManagedObjectContext *backgroundContext = [NSManagedObjectContext privateQueueManagedObjectContext]; | |
[backgroundContext performBlock:^{ | |
backgroundContext.persistentStoreCoordinator = coordinator; | |
NSError *error = nil; | |
NSInteger count = [backgroundContext countForFetchRequest:request error:&error]; | |
[self performBlock:^{ | |
if (completion) { | |
completion(count, error); | |
} | |
}]; | |
}]; | |
} | |
- (void)asyncExecuteBlockInBackgroundContext:(void (^)(NSManagedObjectContext *backgroundContext))block { | |
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator; | |
NSManagedObjectContext *backgroundContext = [NSManagedObjectContext privateQueueManagedObjectContext]; | |
[backgroundContext performBlock:^{ | |
backgroundContext.persistentStoreCoordinator = coordinator; | |
if (block) { | |
block(backgroundContext); | |
} | |
}]; | |
} | |
#pragma mark - Helpers | |
+ (instancetype)privateQueueManagedObjectContext { | |
return [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment