Не кэшировать конкретные запросы с помощью RestKit

Моя проблема

Я не могу кешировать определенный запрос, но другие используют ту же библиотеку и сервер да

http://server.com/lastEntities?authors=37&authors=125&authors=32&authors=36&authors=561&page=0&fromDate=&toDate=&pageSize=20

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

Я использую Charles Proxy для просмотра клиентских запросов, и только тот, который выше, всегда вызывает игнорирование политики кэширования сервера и повторение сети снова и снова.

Ответ сервера

Контроль кеша:

no-transform, max-age=300

Тип содержимого:

application/json;charset=utf-8

Код

RestKit ~> 0.20.0

Установка NSURL sharedCache

В AppDelegate:

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:10 * 1024 * 1024
                                                      diskCapacity:20 * 1024 * 1024
                                                          diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];

Другая слепая попытка кеширования

В моем подклассе "RKObjectManager" я делаю это как попытку форсировать кэш, но если я не ошибаюсь, RestKit использует NSURLCache прозрачно для разработчика, единственное, что нужно, - это то, что сервер возвращает соответствующий "элемент управления Cache" заголовок

- (NSMutableURLRequest *)requestWithObject:(id)object method:(RKRequestMethod)method path:(NSString *)path parameters:(NSDictionary *)parameters
{
    NSMutableURLRequest *request = [super requestWithObject:object method:method path:path parameters:parameters];
    request.cachePolicy = NSURLRequestUseProtocolCachePolicy ;

    return request;
}

Делать запрос

- (void) lastEntities:(NSDictionary *)params
            onSuccess:(void (^)(NSArray *entities, int numEntities)) success
              failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure{
NSString *path = @"entity";

NSMutableDictionary *requestParams = [NSMutableDictionary dictionaryWithDictionary:params];

NSString *urlParams = [NSString stringWithFormat:@"%@?",path];

//Compose the URL with query params


[sharedManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:[MVEntityModel responseMapping]
                                                                                  method:RKRequestMethodGET
                                                                             pathPattern:path
                                                                                 keyPath:@"entities"
                                                                             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[mapping addAttributeMappingsFromDictionary:@{@"numEntities": @"numEntities"}];
[sharedManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:mapping
                                                                                  method:RKRequestMethodGET
                                                                             pathPattern:path
                                                                                 keyPath:nil
                                                                             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];

[self getObjectsAtPath:urlParams parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    if (success) {
        success([mappingResult.dictionary objectForKey:@"entities"], (int)[[[mappingResult.dictionary objectForKey:[NSNull null]] objectForKey:@"numEntities"] integerValue]);
    }
} failure:nil
 ];
}

1 ответ

Решение

Наиболее очевидная причина не хранить ответ в кеше - это размер ответа. В NSURLCache есть механизм для определения того, какой максимальный размер файла он будет кешировать. Этот размер связан с вашим максимальным размером кэша. Точное соотношение не ясно (нигде не задокументировано). Попробуйте установить размер кеша намного больше, чем у 10 и 20 МБ, которые есть у вас сейчас.

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