Отправка управляемого объекта через RestKit приводит к невозможности обновления объекта, который никогда не был вставлен.

Я создаю управляемый объект, сохраняю контекст и публикую так:

 [[RKObjectManager sharedManager] postObject:tag mapResponseWith:tagMappingForPOST delegate:tagLoader];

tagLoader возвращает объект, но не может сохранить его в контексте RestKit, говоря:

Failed to save managed object context after mapping completed: The operation couldn’t be completed. (Cocoa error 134030.)

NSUnderlyingException=Cannot update object that was never inserted.

Я делаю то же самое с тем же внутренним сервером (Parse.com) с тем же классом, и он работает нормально. Любые подсказки относительно возможных причин, по которым можно получить «Невозможно обновить объект, который никогда не был вставлен». ошибка?


person Jinyoung Kim    schedule 28.06.2012    source источник
comment
Как вы создаете свой объект тега? Я подозреваю, что он никогда не был вставлен в ваш постоянный магазин. Возможно, он находится в другом контексте потока/управляемого объекта, возможно, он был создан с помощью инициализации, а не вставки?   -  person Paul de Lange    schedule 29.06.2012


Ответы (1)


Получается, что RestKit ожидает, что контекст будет сохранен перед отправкой сообщения postObject:mapResponseWith:delegate в RKObjectManager. Моя проблема заключалась в том, что я сохранял контекст сразу после сообщения postObject:mapResponseWith:delegate (что, как я думал, было в порядке, потому что это все равно было бы до того, как загрузчик когда-либо получил ответ от веб-службы. Я делал что-то вроде этого:

NSManagedObject *myObj = [NSEntityDescription insertNewObjectForEntityForName:@"MyObjects" inManagedObjectContext:context];
[[RKObjectManager sharedManager] postObject:myObj mapResponseWith:objMappingForPOST delegate:myObjLoader];
[context save:&error];

... тогда myObjLoader получит ответ и попытается обновить свойства в myObj (createdAt, идентификатор объекта синтаксического анализа и т. д.) и выдаст ошибку о том, что myObj не существует.

Я действительно должен прочитать код RestKit, чтобы подтвердить, но я почти уверен, что происходит то, что RKObjectManager создает фоновый поток и контекст из хранилища управляемых объектов в момент получения сообщения postObject:mapResponseWith:delegate и никогда не обновляется ни с каким потенциальные слияния, которые могут существовать до того, как ответ вернется. Честно говоря, я ожидал, что контекст будет создан после получения ответа.

Итак, нужно сохранить контекст перед отправкой сообщения postObject:mapResponseWith:delegate, например:

NSManagedObject *myObj = [NSEntityDescription insertNewObjectForEntityForName:@"MyObjects" inManagedObjectContext:context];
[context save:&error];
[[RKObjectManager sharedManager] postObject:myObj mapResponseWith:objMappingForPOST delegate:myObjLoader];
person Jinyoung Kim    schedule 29.06.2012
comment
Это тоже решило мою проблему. Я просмотрел исходники RestKits и нигде не нашел сохранения контекста. Это забавно, потому что это не было проблемой, пока я не начал рефакторинг кода. Я думаю, что это также может быть проблема времени/синхронизации. - person code0100fun; 19.04.2013
comment
Спасибо, я использовал save внутри [context performBlock:] без необходимости, так как я уже был внутри блока контекста. Я удалил performBlock и он начал работать. - person Borzh; 23.06.2016