2012-04-01 166 views

回答

24

Cacheing由NSURLCache處理應用程序範圍內。如果您未設置共享緩存,則不會緩存請求。即使共享NSURLCache,iOS上的默認實現仍然不支持磁盤緩存。

這就是說,除非你有一個非常特別的理由來編寫你自己的緩存系統,否則我會強烈推薦NSURLCache適用於99.9%的應用程序:它處理來自傳入響應的緩存指令,並在新請求中適當地使用它們,並以不會成爲應用程序性能瓶頸的方式自動執行。作爲一個自己浪費了無數個小時的人(,後來把它扔掉了,因爲它完全沒有必要),我想說有更好的地方來關注你的發展。

+3

有什麼辦法可以禁用它嗎?無論如何,我真的需要這個,因爲我的緩存系統有點不正統。這是一個真正的必須禁用緩存。 – 2012-04-08 19:34:26

+0

默認關閉。您必須通過創建一個「NSURLCache」並將其設置爲共享緩存來選擇加入。 – mattt 2012-04-08 19:52:14

+4

它已經?目前看起來它會爲您自動生成。 https://github.com/AFNetworking/AFNetworking/blob/experimental-1.0RC1/AFNetworking/UIImageView%2BAFNetworking.m#L70 – steipete 2012-04-08 22:23:06

23

我發現在iOS 6上有時會緩存請求,即使請求有NSURLRequestReloadIgnoringCacheData。添加一個返回nil的緩存響應塊可防止請求被緩存。

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url 
               cachePolicy:NSURLRequestReloadIgnoringCacheData 
              timeoutInterval:20]; 
AFJSONRequestOperation *op = 
[AFJSONRequestOperation JSONRequestOperationWithRequest:request]; 

// DISABLE CACHE // 
[op setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) { 
    return nil; 
}]; 

[op start]; 
+0

我第二個這個。感謝您的解決方案! – Firefly 2013-05-22 12:13:25

+4

對於使用'AFHTTPClient',我們應該重寫'requestWithMethod:path:parameters' .Call超級方法來獲取'NSURLRequest'並說'request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;' – Yeung 2013-06-19 03:17:43

+0

你能否修正錯誤類型的枚舉在你的代碼片段?對於沒有注意到有兩個更新的人來說,這會導致錯過。 – 2014-01-22 05:10:04

25

最初我找到Jason Moore的工作答案,但是最近我發現我的應用程序仍在緩存請求。我沒有使用最新的AFNetworking,所以我不知道最近的版本是否已經解決了緩存問題。

蘋果的Urlcache文件項目有這樣一段話:

默認情況下,可可URL加載系統使用一個小的共享內存 緩存。我們不需要這個緩存,因此我們在啓動 應用程序時將其設置爲零。

然後這樣做來禁用緩存。

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 
                 diskCapacity:0 
                  diskPath:nil]; 
[NSURLCache setSharedURLCache:sharedCache]; 
[sharedCache release]; 

這將禁用所有緩存爲您的整個應用程序,它可能無法在某些情況下是理想的,但NSURLRequest沒有履行所要求的高速緩存策略,這是剩下的唯一選擇,我可以看到。

+1

即使與AFnetworking工作 - 緩存損壞從https服務恢復下載... – PetrV 2013-07-11 22:21:22

0
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; 
8

不幸的是,這些方法都不適用於我。我已經成功地得到禁用緩存的唯一方法是這樣:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

Here's the original answer

+0

我有一個單身管理後臺調用。我把這兩行代碼放在init方法中,一切正常! – Zeb 2015-09-29 07:53:10

0

這可能取決於你的服務器上執行,但添加Cache-Control:no-store頭外出的請求應當導致一個響應包含相同的頭部,因此命令NSURLCache不緩存對磁盤的響應。

恕我直言,這是一種比完全禁用磁盤緩存更好的方法,特別是如果您正在編寫其他應用程序可能要使用NSURLCache的SDK代碼。