Как синхронизировать данные из веб-службы с основными данными?

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

Проблема заключается в том, что с помощью Core Data вы должны фактически вставлять объекты в NSObjectManagedContext для создания экземпляров NSManagedObjects. Вот так:

MyModel *model = (MyModel *)[NSEntityDescription insertNewObjectForEntityForName:@"MyModel" inManagedObjectContext:moc];
model.value = [jsonDict objectForKey:@"value"];

Поэтому, когда я получаю данные из веб-службы, я вставляю их сразу в Core Data. Итак, никакой реальной синхронизации не происходит: я просто удаляю все заранее, а затем вставляю то, что возвращается с моей веб-службы.

Я предполагаю, что лучший способ сделать это, но я не знаю, как это сделать. Любая помощь?

Ответ 1

Вы используете классическую вставку/обновление/удаление парадигмы.

Ответ: это зависит. Если вы получите кусок json-данных, вы можете использовать KVC для извлечения уникальных идентификаторов из этого фрагмента и сделать выборку из вашего контекста, чтобы узнать, что уже существует. Оттуда это простой цикл над куском данных, вставка и обновление по мере необходимости.

Если вы не получите данные в таком хорошем куске, то вам, вероятно, потребуется сделать выборку для каждой записи, чтобы определить, является ли она вставкой или обновлением. Это намного дороже, и его следует избегать. Рекомендуется пакетная выборка перед рукой.

Удаление происходит примерно так же дорого, как выборка/обновление, так как вам нужно получить объекты для их удаления в любом случае, чтобы вы могли нормально обрабатывать обновление.

Update

Да, существует эффективный способ создания словаря из объектов Core Data. Когда вы получите массив существующих объектов из Core Data, вы можете превратить его в словарь с помощью:

NSArray *array = ...; //Results from Core Data fetch
NSDictionary *objectMap = [NSDictionary dictionaryWithObjects:array forKeys:[array valueForKey:@"identifier"]];

Это предполагает, что у вас есть атрибут identifier в объекте Core Data. Измените имя по мере необходимости.

С помощью одной строки кода теперь у вас есть все существующие объекты в NSDictionary, с которыми вы можете столкнуться, когда будете ходить по JSON.

Ответ 2

Проще всего сделать, чтобы восстановить Json для сущности, которая правильно отображает его. После того как вы его сопоставили, определите, существует ли объект, соответствующий идентификатору сущностей, если это так, то извлеките сущность и смените изменения. Если нет, создайте новый объект в Core Data и восстановите Json.

Я создаю приложение, я выполняю синхронизацию на стороне клиента с Evernote. Они сохраняют номер syncUpdate для всех своих объектов и на уровне сервера. Поэтому, когда я запускаю свою синхронизацию, я проверяю, меньше ли счетчиков syncUpdate моих клиентов, чем серверов. Если это так, я знаю, что я не в синхронизации. Если мой updateCount равен 400, а сервер - 410, я говорю серверу предоставить мне все объекты между updateCount 400 и 410. Затем я проверяю, есть ли у меня уже объекты или нет, и выполняю мое обновление/создание.

Каждый раз, когда объект модифицируется на сервере, объекты UpdateCount увеличиваются вместе с серверами.

Сервер также сохраняет отметку времени последнего обновления, которое я также могу проверить.