Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

proper way to save NSManagedContext with latest version of Magical Record

In order to save my current NSManagedObjectContext I use [localContext MR_saveNestedContexts]; but I get a warning that the method has been deprecated.

How should I save an NSManagedObjectContext with the latest version of Magical Record (literally pulled from GitHub today, Jul 19 2013).

like image 511
Apollo Avatar asked Jul 19 '13 21:07

Apollo


1 Answers

Check out their documentation.
https://github.com/magicalpanda/MagicalRecord/blob/master/Docs/Saving-Entities.md

Also, they've been very responsive when I've asked them questions in the past. You could always try your hand at that as well.

Edit:

Not sure why I got the down vote. Maybe the documentation was too confusing. Try using

- (void) MR_saveToPersistentStoreWithCompletion:(MRSaveCompletionHandler)completion;

I'm not using the latest version of MagicalRecord, but I think this should be correct

    //get the context for the current thread
    //this context can be updated by anyone other process on this thread that uses the same MR_contextForCurrentThread call
    //it's a local store that can be merged to a parent store
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

    //create an NSManagedObject of type YourEntity and insert it into the localContext object
    NSManagedObject *obj = [YourEntity MR_createInContext:localContext];

    //make any updates to obj

    //save the localContext async
    //this call should save all nested NSManagedObjectContexts as well (if they exist)
    [localContext  MR_saveToPersistentStoreWithCompletion:^{
        //when the async save is complete, this block gets executed
        //blocks work very similarly to javascript callbacks
        //basically it's a function reference or block of code that get's packaged up and can be passed around
        //In this case, the completion block allows to to run any code after the save has been completed.
    }];

One thing I didn't realize when I started was when I created my entity, it also inserted it into the context. It caused me to accidentally save objects that I didn't need to persist. To avoid this I setup a subcontext and only save it when I want to persist the objects.

self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
self.context.parentContext = [NSManagedObjectContext MR_defaultContext];
like image 78
JeffRegan Avatar answered Sep 21 '22 08:09

JeffRegan