Is there any loss in data if I save outside the loop when adding objects vs when I do it inside the loop? Asking since saving outside is much faster.
Outside Loop:
for(NSMutableDictionary *result in data){
[manager newManagedCaf];
for (NSString *name in result){
if ([name isEqualToString:@"contact"]){
NSNumber *num = [NSNumber numberWithInteger:[[result valueForKey:name] integerValue]];
[[manager cafCards] setValue:num forKey:name];
}
else{
[[manager cafCards] setValue:[result valueForKey:name] forKey:name];
}
}
[[manager cafCards] setValue:[NSNumber numberWithBool:YES] forKey:@"synced"];
}
}
if(![[manager cafCards].managedObjectContext save:&error]){
NSLog(@"Unable to save managed object context.");
NSLog(@"%@, %@", error, error.localizedDescription);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Error: %@", [error localizedDescription]] message:@"Database not working, try again later or inform IT." delegate:self cancelButtonTitle:@"Back" otherButtonTitles:nil, nil];
[alert show];
[self getImages:0 con:con withManager:manager];
}
Inside Loop:
for(NSMutableDictionary *result in data){
[manager newManagedCaf];
for (NSString *name in result){
if ([name isEqualToString:@"contact"]){
NSNumber *num = [NSNumber numberWithInteger:[[result valueForKey:name] integerValue]];
[[manager cafCards] setValue:num forKey:name];
}
else{
[[manager cafCards] setValue:[result valueForKey:name] forKey:name];
}
}
[[manager cafCards] setValue:[NSNumber numberWithBool:YES] forKey:@"synced"];
if(![[manager cafCards].managedObjectContext save:&error]){
NSLog(@"Unable to save managed object context.");
NSLog(@"%@, %@", error, error.localizedDescription);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Error: %@", [error localizedDescription]] message:@"Database not working, try again later or inform IT." delegate:self cancelButtonTitle:@"Back" otherButtonTitles:nil, nil];
[alert show];
}
}
get the following error when I put error handling outside:
[2664:3215894] Unable to save managed object context.
2017-06-07 14:48:22.644 [2664:3215894] (null), (null)
2017-06-07 14:48:22.778 [2664:3215894] This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.
No there is no data loss.
It's even the recommended way to commit the data (once) after batch operations.
But you should also move the error handling displaying Unable to save...
out of the loop after the save line. (Btw: UIAlertView
is deprecated for a long time).