Как отключить кеширование в MKNetworkKit или MKNetworkEngine?

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

Есть ли способ отключить кэширование для всего экземпляра MKNetworkEngine?

1 ответ

Решение

Перво-наперво: действительно ли вы уверены в своем сценарии использования кэширования? Большинство тех, кто предоставляет веб-сервисы, устанавливают для своих заголовков Cache-Pragma/ETags разумное значение. Если они это сделают, MKNetworkKit поступит правильно и ответит на ваш код только попаданием в кеш, если это действительно для вашего запроса.

Тем не менее вы можете контролировать использование кэша двумя способами. Прямо из MKNetworkEngine.h:

    /*!
 *  @abstract Enqueues your operation into the shared queue.
 *  
 *  @discussion
 *  The operation you created is enqueued to the shared queue. 
 *  When forceReload is NO, this method behaves like enqueueOperation:
 *  When forceReload is YES, No cached data will be returned even if cached data is available.
 *  @seealso
 *  enqueueOperation:
 */
-(void) enqueueOperation:(MKNetworkOperation*) operation forceReload:(BOOL) forceReload;

призвание enqeueOperation:forceReload: с forceReload установленным в YES сделает свое дело. Вот так:

-(MKNetworkOperation *)myNetworkOperation onCompletion:(MYComplectionBlock)completionBlock onError:(MKNKErrorBlock)errorBlock {

    MKNetworkOperation *op = [self operationWithPath:kURLPath params:nil httpMethod:@"GET" ssl:NO];
    [op onCompletion:^(MKNetworkOperation *completedOperation) {
        // handle the response
        completionBlock(...)
    } onError:^(NSError *error) {
        errorBlock(error);
    }];

    [self enqueueOperation:op forceReload:YES];
    return op;  
}

Более того, вы можете явно очистить кеш (будьте осторожны, это означает, что кеш очищается для всех ваших запросов) с помощью вызова [self emptyCache] как раз перед [self enqueueOperation:op] внутри вашего MKNetworkEngine подкласс.

-(MKNetworkOperation *)myNetworkOperation onCompletion:(MYComplectionBlock)completionBlock onError:(MKNKErrorBlock)errorBlock {

    MKNetworkOperation *op = [self operationWithPath:kURLPath params:nil httpMethod:@"GET" ssl:NO];
    [op onCompletion:^(MKNetworkOperation *completedOperation) {
        // handle the response
        completionBlock(...)
    } onError:^(NSError *error) {
        errorBlock(error);
    }];

    [self emptyCache];
    [self enqueueOperation:op];
    return op;  
}
Другие вопросы по тегам