RestKit удалить правило потерянных объектов

Можно ли установить что-то вроде глобального правила для RKbjectManager удалить потерянные объекты при успешном отображении.

Я сейчас пользуюсь RKPathMatcher удалить сирот для конкретного шаблона пути, но мне кажется, что я что-то упустил.

1 ответ

Решение

Прочтите "Блоки запросов извлечения " в RKManagedObjectRequestOperation, которые являются предварительно настроенными NSFetchRequests для возврата всех объектов данного типа из вашего локального хранилища, чтобы RestKit мог найти сирот, которых больше нет в ответе сервера.

Их примерный блок просто проверяет терминалы аэропорта:

RKObjectManager *manager = [RKObjectManager managerWithBaseURL:@"http://restkit.org"];
[manager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
    RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"/airports/:airport_id/terminals.json"];

    NSDictionary *argsDict = nil;
    BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict];
    NSString *airportID;
    if (match) {
        airportID = [argsDict objectForKey:@"airport_id"];
        NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Terminal"];
        fetchRequest.predicate = [NSPredicate predicateWithFormat:@"airportID = %@", @([airportID integerValue])]; // NOTE: Coerced from string to number
        fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES] ];
        return fetchRequest;
    }

    return nil;
}];

но вы можете установить pathMatcher для соответствия любому шаблону, если ваши URL более общие:

RKPathMatcher *entityMatcher = [RKPathMatcher pathMatcherWithPattern:@"/tables/:entityName"];

BOOL entityMatch = (pathAndQueryString != nil) && [entityMatcher matchesPath:pathAndQueryString tokenizeQueryStrings:YES parsedArguments:&argsDict];
if (entityMatch) {
  NSString *entityName = argsDict[@"entityName"];

  NSFetchRequest *fetchRequest;
  if (entityName) {
    fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName];
    fetchRequest.includesSubentities = NO;
  }

  return fetchRequest;
}

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

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