Неправильное использование API: Попытка сериализовать доступ к хранилищу для не владеющего координатором при попытке доступа к свойству дочернего контекста - PullRequest
0 голосов
/ 14 апреля 2019

На следующий код:

CustomObject *customObject = [[CustomObject alloc] initWithContext:self.persistentContainer.viewContext];
customObject.name = @"TEST";
customObject.customID = 1234;

NSManagedObjectContext *firstContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
firstContext.parentContext = self.persistentContainer.viewContext;
CustomObject *contextObj = [firstContext objectWithID:customObject.objectID];
NSError *error;

[self.persistentContainer.viewContext save:&error];
NSLog(@"ERROR [%@", error);
NSLog(@"NAME [%@]", contextObj.name);

Я получаю результат:

ERROR [(null)
[error] error:  API Misuse: Attempt to serialize store access on non-owning coordinator (PSC = 0x6000015fa300, store PSC = 0x0)
CoreData: error:  API Misuse: Attempt to serialize store access on non-owning coordinator (PSC = 0x6000015fa300, store PSC = 0x0)
NAME [(null)]

Я пытаюсь понять, почему появляется это предупреждение. Я ожидаю, что после сохранения основного контекста я все еще смогу получить доступ к свойству объекта в его дочернем контексте без каких-либо проблем.

Интересная часть заключается в том, что, если перед сохранением основного контекста я сбросил значение contextObj, все работает нормально:

CustomObject *customObject = [[CustomObject alloc] initWithContext:self.persistentContainer.viewContext];
customObject.name = @"TEST";
customObject.customID = 12234;

NSManagedObjectContext *firstContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
firstContext.parentContext = self.persistentContainer.viewContext;
CustomObject *contextObj = [firstContext objectWithID:customObject.objectID];
NSError *error;
NSLog(@"NAME [%@]", contextObj.name);
[self.persistentContainer.viewContext save:&error];
NSLog(@"ERROR [%@", error);
NSLog(@"NAME [%@]", contextObj.name);

NAME [TEST]
ERROR [(null)
NAME [TEST]

Любые идеи о том, почему это происходит, будут оценены. Спасибо.

...