NSIncrementalStore вызывается с помощью NSSaveChangesRequest.deletedObjects == nil

Я нахожусь в процессе написания NSIncrementalStore это поддерживается службой REST. Он хорошо работает для объектов POSTing и GETing, но при их удалении я сталкиваюсь со следующей проблемой:

  1. тестовые звонки [context delete: object];
  2. context.deletedObjects содержит object (как и следовало ожидать)
  3. тестовые звонки [context save: &error];
  4. звонки с iOS NSIncrementalStores executeRequest:withContext:error: с NSSaveChangesRequest; когда поступит звонок оба context.deletedObjects == nil а также saveChangesRequest.deletedObjects == nil, так что мой код не может узнать, какие объекты для удаления с сервера.

Как это может случиться, что deletedObjects установлен в nil между призывом к контексту save и его вызов его NSIncrementalStore?

ОБНОВЛЕНИЕ возможная причина: object.objectID все еще temporaryID следующий save, NSIncrementalStore в настоящее время получает идентификаторы объектов от newObjectIDForEntity:referenceObject: и описание из документации Apple как-то пока не подходит:

Новым объектам, вставленным в контекст управляемого объекта, присваивается временный идентификатор, который заменяется постоянным после сохранения объекта в постоянном хранилище.

1 ответ

Решение

Проблема была в том, что я еще не хранил достаточно информации на сервере для воссоздания (постоянных) идентификаторов объектов во время выборок.

Это решает проблему в NSIncrementalStore:

  • когда executeRequest:withContext:error: получает NSSaveChangesRequest он извлекает (в моем случае) ссылочные строки из сохраненных объектов с referenceObjectForObjectID: и сохраняет их (вместе с другими атрибутами объектов) на сервере.

  • когда executeRequest:withContext:error: получает NSFetchRequest он получает ссылочные строки (вместе с другими атрибутами объектов) с сервера и воссоздает объекты с [context objectWithID: [self newObjectIDForEntity: entity referenceObject: referenceString]],

Другие вопросы по тегам