Прочитайте «Блоки запроса на выбор» в 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;
}
Тогда вам просто нужно бы один блок запроса выборки, чтобы соответствовать любому из ваших объектов.
Спасибо @ Эрик Хедстром, предположим, что это самое близкое, что я могу получить с помощью этой опции с RestKit. –
Так есть причина, почему sortDescriptor включен в fetchRequest? Сортировка не должна быть необходимой, чтобы делать разницу между записями, не так ли? – deepwinter
@deepwinter Да, я бы предположил, что запрос выборки в верхнем примере был скопирован/вставлен из другого кода запроса. Вам не нужны дескрипторы сортировки для этих блоков запроса выборки. –