Как отключить кеширование в 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;
}