2013-07-27 58 views
2

我有一個簡單的方法,需要一個URL和負載從服務器:奇怪NSURLConnection的緩存行爲

- (void)loadURL:(NSString*)url 
{ 
    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init]; 
    request.HTTPMethod = @"GET"; 
    request.URL = [NSURL URLWithString:url]; 

    NSHTTPURLResponse* response; 
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; 
} 

服務器返回與1天最大年齡的響應。

問題是,當我重複運行這些3條線,它們中的2隨機錯過緩存和重新加載響應:

[self loadURL:@"http://192.168.0.105:8080/users/51bdbc73808897302f000001/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww"]; 
[self loadURL:@"http://192.168.0.105:8080/users/51ee9d4e263d08fe04000003/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww"]; 
[self loadURL:@"http://192.168.0.105:8080/users/51d17b81de38c60b20000006/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww"]; 

如果我添加一些隨機唯一的數據(&的x,& Y,&ž )到每個請求的查詢字符串它解決了這個問題:

[self loadURL:@"http://192.168.0.105:8080/users/51bdbc73808897302f000001/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww&x"]; 
[self loadURL:@"http://192.168.0.105:8080/users/51ee9d4e263d08fe04000003/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww&y"]; 
[self loadURL:@"http://192.168.0.105:8080/users/51d17b81de38c60b20000006/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09RoyipmXgcENwfE6EV9yzvgp5VTSZww&z"]; 

另外,如果我減少查詢字符串的長度以80個字符它解決了這個問題,以及:

[self loadURL:@"http://192.168.0.105:8080/users/51bdbc73808897302f000001/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09Royipm"]; 
[self loadURL:@"http://192.168.0.105:8080/users/51ee9d4e263d08fe04000003/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09Royipm"]; 
[self loadURL:@"http://192.168.0.105:8080/users/51d17b81de38c60b20000006/avatar?size=200x200&access_token=abcdefghijklmnopqrstuvwxyzzp77eDLqub3EWfXGe4c09Royipm"]; 

這是怎麼回事? 這是iOS中的錯誤嗎?我該如何解決它?

P.S:我已經沒有多餘的東西都在iOS 5測試這在一個空的應用程序和6

+0

怎樣檢驗網址加載系統無論從緩存中讀取或訪問遠程服務器?請求中設置了哪些緩存控制標頭?客戶端是否使用緩存?請注意,緩存可能會忽略服務器指定的到期時間。 – CouchDeveloper

+0

@CouchDeveloper我運行'tail -f server.log | grep avatar'在進入時實時查看請求。服務器將Cache-Control標頭的值設置爲'max-age = 86400'。客戶端有NSURLCache集。 – soheilpro

+0

您需要檢查請求中的緩存控制標頭。如前所述,客戶端可以忽略從服務器或代理設置的到期日期。緩存是相當複雜:[13緩存在HTTP](http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html) – CouchDeveloper

回答

0

坐落在NSURLRequestrequestWithURL:cachePolicy:timeoutInterval:緩存行爲。嘗試:

- (void)loadURL:(NSString*)url 
{ 
    NSURL *url = [NSURL URLWithString:url]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0]; 

    NSHTTPURLResponse* response; 
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; 
} 

也可能使用​​的cachePolicy

+0

這會改變緩存策略,因爲它繞過了緩存策略,但並不能解釋爲什麼有時應該使用緩存。 – CouchDeveloper