For concurrency in coredata I am using parent-child MOC concept where parent context is of NSMainQueueConcurrencyType
and child context is of NSPrivateQueueConcurrencyType
and below is the code to
- (NSManagedObjectContext *)managedObjectContext
{
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];// DONE to avoid crash when the app auto logs out
managedObjectContext.persistentStoreCoordinator = coordinator;
}
return managedObjectContext;
}
-(NSManagedObjectContext *)getPrivateMOC
{
NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:[self managedObjectContext]];
return private;
}
-(void)storeCustomerData:(NSArray *)custData
{
NSManagedObjectContext *currentbgContext = [self getPrivateMOC];
[currentbgContext performBlock:^{
for (NSDictionary *jsonObject in custData) {
CustomerEntity *custEntity = [NSEntityDescription insertNewObjectForEntityForName:@"CustomerEntity" inManagedObjectContext:currentbgContext];
custEntity.fname = [jsonObject field:@"fname"];
custEntity.lname = [jsonObject field:@"lname"];
}
NSError *error = nil;
if (![currentbgContext save:&error]) {
NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
//abort();
}
}];
}
If I use parent context in method storeCustomerData
it works but using child context getPrivateMOC()
doesn't.
Please let me know if I am missing anything