Skip to content

Instantly share code, notes, and snippets.

@kenthumphries
Last active August 29, 2015 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kenthumphries/cf5ae5e85cb366d89626 to your computer and use it in GitHub Desktop.
Save kenthumphries/cf5ae5e85cb366d89626 to your computer and use it in GitHub Desktop.
Method to quickly perform a block using a temporary managed object context. Can be useful if you need to perform a few pre-migration optimisations to a database.
typedef NSError *(^NSManagedObjectContextBlock)(NSManagedObjectContext *context);
+ (void)performBlock:(NSManagedObjectContextBlock)block withTemporaryManagedObjectContextFromDatabaseAtURL:(NSURL *)url withModelBundle:(NSBundle *)bundle
{
NSParameterAssert(block);
if (!block)
{
return;
}
NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:url error:nil];
NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:@[bundle] forStoreMetadata:storeMetadata];
if (sourceModel) // If sourceModel cannot be found, cannot create a context
{
@autoreleasepool {
// Create a temporary persistentStoreCoordinator based on source model
NSPersistentStoreCoordinator *temporaryStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:sourceModel];
NSError *error;
[temporaryStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:url
options:@{NSIgnorePersistentStoreVersioningOption:@YES}
error:&error];
if (!error)
{
NSManagedObjectContext *temporaryManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType];
temporaryManagedObjectContext.persistentStoreCoordinator = temporaryStoreCoordinator;
block(temporaryManagedObjectContext);
temporaryManagedObjectContext = nil; // Clean up to release any ownership of DB store
}
temporaryStoreCoordinator = nil; // clean up to release any ownership of DB store
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment