2015-09-18 60 views
2

我正在使用NSURLSession進行聯網並向服務器發送POST請求。我希望能夠緩存這些請求,但URL總是相同的。NSURLCache緩存不同的POST請求

是否可以使用NSURLCache進行緩存並將緩存鍵更改爲唯一的內容,如請求正文?

回答

0

默認情況下,IIRC POST請求根本沒有被緩存。但是,是的,你當然可以做到。 IIRC,在NSURLSession方面,唯一可以控制的是請求是否被緩存。要實際控制緩存的名稱,您需要實現自定義URL協議。我從來沒有做過你想要做什麼,但我敢肯定你會做它大致如下:

  • 創建NSURLProtocol子類,並通過你的會話protocolClasses財產提供它組態。從那一刻開始,無論何時該會話發出URL請求,都會首先調用您的類。

  • 在該亞類中,在你startLoading方法,使用的setProperty:forKey:inRequest:標記該請求由您的協議已經被處理。

  • 在你canInitWithRequest方法,調用propertyForKey:inRequest:,看是否請求已經被標記,如果是這樣,則返回NO。這樣,你會看到每個請求只有一次。

  • 在您的startLoading方法中,使用帶標記的請求啓動一個新的數據任務。

  • stopLoading,取消任務。

  • canonicalRequestForRequest:,做你的轉換。您可能必須使用setProperty:forKey:inRequest:來存儲原始未修改的網址,以防萬一您找回修改後的網址。 (我不知道)。

  • 我不認爲你需要實現requestIsCacheEquivalent:toRequest:,但請記住它,以防萬一我錯了。您也許可以實現這一點,而不是規範化方法。

+0

@dgatwoord,我檢查了NSURLCache的文檔,但是我找不到任何關於它是否可以緩存POST請求的內容。你可以和我分享一下嗎? – aelam

+0

默認情況下,NSURLSession/Connection不緩存POST請求,因爲它們不保證是冪等的。也就是說,緩存本身就是,如果內存服務的話,幾乎只是一個啞鍵值存儲被持久化到磁盤。如果你在那裏放置一個對象,當你請求時它應該在那裏。上面的解釋告訴我們如何去做。 (您可能還需要將請求類型更改爲「GET」,然後將其添加到緩存中並從中檢索) – dgatwood

+0

或者,如果上述步驟不起作用,則始終可以從上面列出的東西,然後添加代碼將數據自己存儲在文件中。沒有什麼說你必須使用實際的NSURLCache對象來進行緩存。這只是一個方便的方法。:-) – dgatwood