NSManagedObject's managedObjectContext propert

2019-02-22 21:25发布

问题:

I'm trying to create a temporary managed object context, and after a few screens of the user putting in information, I merge that context with the main context (to ensure that there are no "incomplete" objects are inserted). This is how I create my temporary context and how I insert an object in it:

if (!self.someManagedObject) {

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]];
    NSPersistentStoreCoordinator *storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    [storeCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:nil];

    NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator:storeCoordinator];

    self.someManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SomeObject" inManagedObjectContext:managedObjectContext];
    NSLog(@"%@", self.someManagedObject.managedObjectContext);
}

This is a part ofviewDidLoad. In the console it shows that managed object context has a value.

However, right after this if statement (even within viewDidLoad, self.someManagedObject.managedObjectContext is nil. I can see why the local variable would not be available anymore (it simply goes out of scope), but the managed object's property should still be set, right?

I know I can create a property to store the managed object context, but I'd rather get it to work this way.

回答1:

I recently ran into the same problem again, although it was in a different situation. I needed a temporary managed object context, completely separate from the main one, but I again ran into the problem of it disappearing after it goes out of scope. This time I decided to investigate further, and I ultimately realized that managedObjectContext is not a property of NSManagedObject, but a method. This means one of two things:

  1. If it uses a property in the underlying implementation, that property will not hold a strong reference to the context
  2. If the managed object context is derived in some other way, it will also not hold a strong reference to that context.

In either case, the context has no strong references, goes out of scope, and the NSManagedObjects have a nil managedObjectContext.

The solution was to simply keep the context around by creating a strong property for it.



回答2:

I do not see why you would need a second managed object context. IMHO, you are introducing complexity into your app that does not serve any particular purpose.

Insert the new object into the main context. Let the user input his data. If he breaks off, simply call

[managedObjectContext rollback];

or, if the user finishes and all the data is validated, call

[managedObjectContext save:nil];