ASIHttpRequest - удалить кеш через определенный промежуток времени - PullRequest
0 голосов
/ 19 июня 2011

Я использую библиотеку ASIHttpRequest в своем приложении и пытаюсь установить кэш для определенного запроса, чтобы он мог использоваться до определенного периода времени (если данные не доступно с сервера или отсутствует подключение к Интернету), кроме того, он будет отклонять / удалять кэш и поэтому не будет его использовать.

Итак, я пытаюсь получить запрос, сначала проверив, может ли он получить данные в сети, если он не может получить к ним доступ (по какой-либо причине сервер не работает или нет подключения к Интернету), а затем использовать кэш, при условии, что он не истек. Срок действия кэша я хотел бы установить на определенное время, например, 12 часов, после которого данные были сохранены в кэш.

Что я пробовал до сих пор:

// Set secondsToCache on the request to override any expiry date for the content set by the server, and store 
// this response in the cache until secondsToCache seconds have elapsed
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setSecondsToCache:60*60*24*30]; // Cache for 30 days 

Это взято из примера на сайте.

Однако, похоже, это не дает того эффекта, которого я хотел бы, как описано выше.

Как кэшировать данные в течение определенного времени, после которого они удаляются из кэша?

Ответы [ 3 ]

0 голосов
/ 01 июля 2011

У меня такая же проблема.Метод [request setSecondsToCache: xxx], кажется, не работает с истечением срока действия и не работает с кешем.Если вы не установите

[request setCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];

, кеш будет удален после завершения сеанса.

0 голосов
/ 19 марта 2014

Возможно, он немного староват, но мой код все еще работает на ios7.

-(NSData*)getResponseAsDataFromUrl:(NSURL*)sourceUrl andWithCachePolicy:(ASICachePolicy)cachePolicy andWithExpireDurationInSeconds:(NSTimeInterval)expireDuration{
 ASIHTTPRequest* request = [[ASIHTTPRequest alloc] initWithURL:sourceUrl];
[request setCachePolicy:cachePolicy];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[request setTimeOutSeconds:30];

//We set the expireduration to a second we desire
[request setSecondsToCache:expireDuration];
NSError* error = [request error];
NSData* jsonData;
NSDictionary* cachedHeaderDict = [[ASIDownloadCache sharedCache] cachedResponseHeadersForURL:sourceUrl];
NSDate* expireDate = [NSDate date];
NSDate* now = [NSDate date];
if([[cachedHeaderDict allKeys] containsObject:@"X-ASIHTTPRequest-Expires"]){
    NSNumber* cacheInterval = [cachedHeaderDict objectForKey:@"X-ASIHTTPRequest-Expires"];
    expireDate = [[NSDate alloc] initWithTimeIntervalSince1970:cacheInterval.doubleValue];
}
switch ([now compare:expireDate]) {
    case -1:{
  //            NSLog(@"Cache has not been expired. Using cached response.");
        jsonData = [[NSData alloc] initWithContentsOfFile:[[ASIDownloadCache sharedCache] pathToCachedResponseDataForURL:sourceUrl]];

    }
        break;
    default:{
   //            NSLog(@"Cache expired. Cleaning cached data.");
        [[ASIDownloadCache sharedCache] removeCachedDataForRequest:request];
    }
        break;
}

if(!jsonData){
    [request startSynchronous];
    if(!error){ //If there is no error, use the data
        jsonData = [request responseData];
        if(!jsonData)//This is here for cases where we get empty response and we dont want to store empty responses.
            [[ASIDownloadCache sharedCache] removeCachedDataForRequest:request];
    }else{
        NSLog(@"no response: %@",error.description);
        [[ASIDownloadCache sharedCache] removeCachedDataForRequest:request];
    }
    [request clearDelegatesAndCancel];
    request = nil;
}
return jsonData;
}
0 голосов
/ 20 июня 2011

Попробуйте установить точку останова в canUseCachedDataForRequest в ASIDownloadCache.m; Шаг за шагом и посмотрите, по какому маршруту идет код.

Он должен следовать по одному из путей, вызывающих isCachedDataCurrentForRequest, который должен возвращать NO, если срок действия данных истек.

Из кода видно, что setSecondsToCache должен установить заголовок "X-ASIHTTPRequest-Expires" в кэшированном объекте, что должно заставить isCachedDataCurrentForRequest возвращать NO - я думаю, что только отладка происходит чтобы сказать вам, в какой момент это идет не так в вашем случае.

...