Подтвердить что ты не робот

Каков наиболее эффективный способ синхронизации основных данных с API JSON

Каким будет лучший способ синхронизации моей схемы основных данных с удаленным API, обслуживающим JSON? В настоящий момент я просматриваю каждый словарь в ответе JSON, проверяя Core Data, чтобы узнать, существует ли идентификатор API.

Это отлично работает, но все, что осталось сделать, это удалить любые локальные объекты, которые не находятся на сервере. Вот пример моих данных JSON:

[
   {
      "id":1234,
      "name":"My first object",
      "description":"This is a long string with lots of information"
   },
   {
      "id":1235,
      "name":"My second object",
      "description":"This is a long string with lots of information"
   }
]

В настоящее время единственный способ, которым я могу думать об этом, - это что-то вроде следующего:

NSArray *jsonData = // Convert json data to array using NSJSONSerialization
NSInteger fetchedCount = _fetchedResultsController.fetchedObjects.count;

if (fetchedCount != jsonData.count) {

    for (int i = 0; i < fetchedCount; i++) {

        NSManagedObject *object = [_fetchedResultsController objectAtIndexPath: [NSIndexPath indexPathForItem:i
                                                                                                    inSection:0]];
        NSNumber *idNumber = object.apiID;

        BOOL shouldDelete = YES;

        for (NSDictionary *jsonDict in jsonData) {
            if ([jsonDict  objectForKey:@"id"] == idNumber) {
                shouldDelete = NO;
            }
        }

        if (shouldDelete) {

            // Delete object.
        }            
    }
}

Я думаю, что это будет массово неэффективно, если массив JSON содержит много объектов.

4b9b3361

Ответ 1

Это может быть нормально, но я думаю, вы должны применить шаблон Find-or-Create, предложенный в документе Apple. См. Здесь подробное объяснение Эффективный импорт данных (В частности, см. Реализация Find-or-Create Efficiently).

Общая идея довольно проста. Имеются два массива объектов (тот, который вы извлекаете из Core Data и тот, который вы извлекаете из службы), которые упорядочены (через apiID и id соответственно).

Очевидно, что если есть много данных, я действительно предлагаю выполнить операции в фоновом режиме. Помните, что каждый поток должен полагаться на свой NSManagedObjectContext. В противном случае воспользуйтесь новым механизмом очереди, предоставляемым API iOS 5.

Для полноты я также предлагаю прочитать учебник RayWenderlich Как синхронизировать основные данные с веб-службой. Часть 1 и 2. Это очень интересно.

Надеюсь, что это поможет.