Assuming that you don't care which NSManagedObjectContext is used, and you just want to make some changes and save them in the background, use the following method. 90% of the time, this is what you'll want.
NSManagedObjectSubclass *myObject = [NSManagedObjectSubclass MR_findFirst];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
// Make changes to your managed objects here, create new objects, or delete existing objects
// There's no need to call save within this block
// This block is called on an unspecified background thread
NSManagedObjectSubclass *myLocalObject = [myObject MR_inContext:localContext];
// It's now safe to make changes to `myLocalObject`
} completion:^(BOOL success, NSError *error) {
// Generally, you'll use this completion block to update your UI, or handle success/errors
// This block is always called on the main thread
}];
If you need to save some changes, but need the save operation to block the current thread until it has finished writing to disk — use the following method:
NSManagedObjectSubclass *myObject = [NSManagedObjectSubclass MR_findFirst];
[MagicalRecord saveWithBlockAndWait:^(BOOL success, NSError *error) {
// Make your changes here.
// This block will be called on the main thread. You can safely access objects from outside the block here:
[myObject MR_deleteEntity];
// This method will not return until the save has completed
}];
// Do post processing here — maybe update the UI?
Is it guaranteed that completion block of saveWithBlock will execute after saving the object to all MOCs.