2017-01-19 10 views
0

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

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

ответ

0

Прочитайте «Блоки запроса на выбор» в 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; 
} 

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

+0

Спасибо @ Эрик Хедстром, предположим, что это самое близкое, что я могу получить с помощью этой опции с RestKit. –

+0

Так есть причина, почему sortDescriptor включен в fetchRequest? Сортировка не должна быть необходимой, чтобы делать разницу между записями, не так ли? – deepwinter

+0

@deepwinter Да, я бы предположил, что запрос выборки в верхнем примере был скопирован/вставлен из другого кода запроса. Вам не нужны дескрипторы сортировки для этих блоков запроса выборки. –