2011-06-19 84 views
0

我在我的應用中使用ASIHttpRequest庫,我試圖爲特定請求設置緩存,以便它可以在一段時間內使用(if沒有數據可以從服務器或沒有互聯網連接),除此之外它會拒絕/刪除緩存,所以不會使用它。ASIHttpRequest - 在特定時間間隔後刪除緩存

所以我試圖得到的請求是,首先檢查它是否可以在線檢索數據,如果它無法訪問它(無論出於何種原因,服務器關閉或沒有Internet連接可用),然後使用緩存,只要它沒有過期。我希望設置一定的時間,比如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 

這是從網站上的示例獲取的。

但是,如上所述,這似乎沒有我想要的效果。

如何將數據緩存一段時間,之後將其從緩存中刪除?

+0

你會看到什麼發生? – JosephH

+0

沒有效果 - 我用2分鐘的時間間隔測試了它,所以我將setSecondsToCache中的秒數設置爲60 * 2,並等待3分鐘,並且當我將iPhone設置爲飛行模式時仍然使用緩存的數據。所以它似乎沒有任何影響。 – SMSidat

+0

你在請求上設置了什麼cachePolicy? – JosephH

回答

0

嘗試設置canUseCachedDataForRequest中的斷點ASIDownloadCache.m;單步通過,看看代碼需要什麼路線。

它應該遵循其中一條調用isCachedDataCurrentForRequest的路徑,如果數據已過期,應該返回NO。

從查看code看來,'setSecondsToCache'應該在緩存對象中設置「X-ASIHTTPRequest-Expires」頭,這應該使isCachedDataCurrentForRequest返回NO - 我認爲只有通過調試纔會告訴你哪個點你的情況出錯了。

0

我有同樣的問題。方法[請求setSecondsToCache:xxx]似乎不適用於過期,它也不適用於緩存。如果你沒有設置

[request setCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy]; 

緩存將在會話關閉後被刪除。

0

它可能有點舊,但我的代碼仍在使用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; 
}