Не удается отключить кэширование сетевых запросов в приложении на Objective-c
Пытаюсь устранить неправильную работу сетевых запросов в чужом приложении. При повторной отправке сетевого запроса данные возвращаются старые (видимо из кэша), перелопатил весь код, но известных мне методов настройки параметров кэширования сетевых запросов не обнаружил.
Пробовал:
Отключать кэширование в http-заголовке запроса
[request setValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"];
Отключать кэширование в configuration сессии
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; config.URLCache = nil;
Пробовал устанавливать режим без кэша в параметре самого запроса
[request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
Никаких изменений... Что еще можно посмотреть, где отключить кэширование, если кто сталкивался - помогите, уже третий день ковыряюсь.
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: url1]];
[request setHTTPMethod: @"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody: [requestData requestData]];
NSInputStream* bodyStream = [requestData HTTPBodyStream];
if (bodyStream != nil)
request.HTTPBodyStream = bodyStream;
NSURLSessionConfiguration* configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
configuration.timeoutIntervalForResource = 30;
configuration.timeoutIntervalForRequest = 30;
_session = [[NSURLSession sessionWithConfiguration:configuration] retain]
_statusCodes = [[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 5)] retain];
void (^taskCompletionHandler)(NSData* data, NSURLResponse* response, NSError* error) = ^(NSData* data, NSURLResponse* response, NSError* error)
{
NSUInteger responseStatusCode = 500;
if ([response isKindOfClass:[NSHTTPURLResponse class]])
{
responseStatusCode = ((NSHTTPURLResponse*)response).statusCode;
}
if (_statusCodes != nil && ![_statusCodes containsIndex:responseStatusCode] && [response URL] && error == nil)
{
NSDictionary* errorUserInfo = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"CoreNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:responseStatusCode], (long)responseStatusCode], NSLocalizedDescriptionKey, [response URL], NSURLErrorFailingURLErrorKey, nil];
error = [NSError errorWithDomain:MyNetworkingErrorDomain code:responseStatusCode userInfo:errorUserInfo];
}
MyHTTPResponse* responseObject = [MyHTTPResponse responseWithHTTPURLResponse:(NSHTTPURLResponse*)response data:data error:error];
if (completionHandler != nil) {
completionHandler(responseObject);
}
};
NSURLSessionDataTask* task = [self.anURLSession dataTaskWithRequest:request completionHandler:taskCompletionHandler];
[task resume];
Ответы (3 шт):
Не просто ковыряйтесь, а общайтесь. Если со своей стороны уже попробовали стандартные вещи, проверили как-то по-другому, тогда может "проблема на стороне мишени"? Узнайте подробности работы бекенда. Может у них кеширование как-то настроено, может мощности не хватает, может так организованы хранение и обработка данных.
Упрощенный пример по мотивам реальной проблемы (точнее, такая работа считалась нормальной для того случая, но в контексте Вашего вопроса - проблема): часть данных хранилась в одном месте, часть в другом, статистика в третьем. И вот статистика всегда запаздывала по данным, так как потихоньку собиралась по другим местам. И когда нужно было забрать сводные данные - пользователю не показывалось самое свежее в реальном времени, так как это было бы очень накладно по ресурсам.
Кеширование можно попытаться отключить с помощью EVURLCache.
Вот так я отключал кеширование для API гугл карт
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[EVURLCache activate];
[EVURLCache setIgnoredMasks:@[@"maps\\.googleapis\\.com\\/maps\\/api\\/place"]];
return YES;
}
На четвертый день поисков нашел метод с заурядным названием: clearTemp, он и чистил кэш, создаваемый вручную. Банально :(
Всем спасибо.