2015-11-09 31 views
3

我正在使用以下代碼從TfL下載一些數據。NSURLCache無視max-age

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] 
                 delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.tfl.gov.uk/StopPoint/490012211N/Arrivals"]]; 

[[session dataTaskWithRequest:req 
     completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
      if (!error) { 
       NSLog(@"Loaded Succesfully"); 
      } 
      NSCachedURLResponse *resp = [[NSURLCache sharedURLCache] cachedResponseForRequest:req]; 
      if (resp) { 
       NSLog(@"Response in cache"); 
      } 
      [[session dataTaskWithRequest:req 
         completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
          if (!error) { 
           NSLog(@"Loaded Sucessfully again"); 
          } 
         }] resume]; 
     }] resume]; 

的效應初探的Cache-Control頭場public, must-revalidate, max-age=5, s-maxage=10這似乎意味着服務器將發送即使第二請求是由最大年齡給出的5秒內的請求。如果我使用Charles來編輯響應並刪除必須重新驗證,那麼上面的代碼只會向服務器發送一次請求。

的HTTP/1.1規範說

,它變得陳舊,而無需先與原始服務器重新驗證它的 後續請求響應後緩存絕不能使用的條目。

對於must-revalidate,然而它似乎iOS似乎忽略了「後它變成陳舊」的一部分?並且需要must-revalidate意味着忽略最大年齡。那麼如何將字段設置爲完全不緩存呢?我已經檢查並且請求/響應正在被添加到緩存中,所以它似乎只是膨脹了緩存,因爲它不會使用它,但仍將其添加到緩存中?

因此,服務器不正確,因爲must-revalidatemax-age結合在一起,或者iOS處理方式不正確must-revalidate

是否有攔截響應的方式,以便我可以刪除must-revalidate? NSURLProtocol似乎可能是有用的,但我只能看到如何修改請求,而不是響應。

回答

0

如果你使用NSURLProtocol,你可以發出一個新的請求(一定要標記它,這樣你不會再修改它),然後在響應上,你可以創建一個新的響應對象,基於並將修改後的回覆發送給客戶。無論是否足以解決您的問題,我都不確定。但是,更好的(讀「更加直接的實現」)解決方案可能是NSURLCache對象的子類,並將您的自定義子類用作共享緩存(用於NSURLConnection和NSURLSession共享會話),或者用作per-會話緩存(用於其他NSURLSession會話)。