2015-05-04 105 views
0

我正在創建一個應用程序,我希望隨時使用緩存響應。我遇到了一個與NSURLCache有關的奇怪問題,更具體地說,如果我在我的請求中設置了NSURLRequestReturnCacheDataDontLoad,我沒有在iOS 8上獲得緩存響應。以下是我使用AFNetworking得到此代碼的代碼:iOS 8 NSURLCache問題

// Define web request. 
void (^simpleBlock)(void) = ^{ 
    GTSessionManager.manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 

    [GTSessionManager.manager POST:string parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSDictionary *responseJson = responseObject; 

     [self parseJsonSuccess:responseJson]; 
    } failure:^(NSURLSessionDataTask *task, NSError *error) { 
     if (error.userInfo[JSONResponseSerializerWithDataKey]) { 
      NSData *data = error.userInfo[JSONResponseSerializerWithDataKey]; 

      NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data 
                    options:kNilOptions 
                     error:&error]; 

      [self parseJsonError:json]; 
     } 
     else 
      [self parseJsonError:nil]; 
    }]; 
}; 

if (self.shouldUseCache) { 
    GTSessionManager.manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataDontLoad; 

    [GTSessionManager.manager POST:string parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSDictionary *responseJson = responseObject; 

     [self parseJsonCacheSuccess:responseJson]; 

     // Load second request. 
     simpleBlock(); 
    } failure:^(NSURLSessionDataTask *task, NSError *error) { 
     simpleBlock(); 
    }]; 
} 
else 
    simpleBlock(); 

這裏的主要想法是,如果客戶端想要使用緩存,第一個請求應該嘗試加載它,將結果傳遞給處理程序並開始重新加載請求以刷新緩存。

此方法在iOS 7上運行良好,但不適用於iOS 8+。我通過以下調用設置了NSURLCache。

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:500 * 1024 * 1024 
                  diskCapacity:500 * 1024 * 1024 
                   diskPath:@"cache" /**Tried nil here as well. */]; 
[NSURLCache setSharedURLCache:sharedCache]; 

我讀了一些文章和其他關於這個問題,但我不能得到這個工作。我錯過了什麼嗎?它可能與我正在使用POST請求有關嗎?

編輯 忘了提及我沒有在我的服務器上使用緩存策略。我也嘗試使用Cache-Control=max-age=604800, public設置緩存策略,但我得到了相同的行爲。

回答

0

好的,經過一番進一步的調查後,我得出結論說這個問題在NSURLSession的某個地方。我發送了與上述完全相同的請求,但使用AFHTTPRequestOperation而不是AFHTTPSessionManager,並且緩存在iOS 8+上完美加載。

不太清楚問題仍在哪裏,我認爲它與緩存策略有關,但現在我堅持使用NSURLConnection