2017-09-08 129 views
2
let memoryCapacity = 200 * 1024 * 1024 
let diskCapacity = 1 * 1024 * 1024 
let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath") 
URLCache.shared = cache 

Scenario1什麼時候將事情從urlcache的內存和磁盤中刪除?

我設置Urlcache文件的內存爲200MB,並設置磁盤空間爲1MB。然後我下載一張圖片。關閉互聯網和強制退出應用程序,通過點擊它再次啓動應用程序,並引發調用(下載圖像),但它會立即崩潰,因爲datanil

不用說了,如果我關掉網絡,它仍然會按預期從緩存中讀取,不會發生崩潰。

Scenario2

如果我設置diskCapacity爲200MB(let diskCapacity = 200 * 1024 * 1024) 則即使緩存刷新出的存儲器,靜止圖像被在盤持續;它會一直顯示!


基於這一觀察,我有以下問題:

  • 它是正確的說,每次強制退出時間或您的應用程序崩潰是由於內存警告/問題緩存將獲得刷新,儘管它保持你的磁盤完好無損?
  • 緩存可能被刷新內存不足的其他原因?
  • 什麼時候可以將存儲在磁盤中的東西刪除?

回答

1

簡短的回答:

內存高速緩存丟失時,應用程序終止(或可能的是,在內存壓力下,太)。磁盤緩存跨應用程序的多個調用持久性,但可如果設備用完持久性存儲和OS從高速緩存和臨時文件夾回收空間被刪除。


龍答:

你問:

它是正確的說,每次強制退出時間或您的應用程序崩潰是由於內存警告/問題,你的緩存會得到刷新,儘管它會讓你的磁盤完好無損?

很大程度上。它可能更加精確,以簡單地說,當應用程序終止與你的應用程序的所有內存被丟棄,只保存到永久存儲這些項目可以檢索應用程序重新啓動時。

,其中的緩存可以得到溢出內存的任何其他地方?

您在內存緩存中,當應用程序終止血本無歸。顯然還有其他一些情況,在這種情況下,可以刪除項目:

  • 如果您手動刪除URLCache的響應。
  • 當您接近緩存的最大容量時,舊的單個項目將從緩存中刪除,並嘗試添加新項目,強制排除舊項目。
  • 網絡響應通常包括一個緩存策略(指示響應可以安全緩存多長時間),因此很可能在那時刪除它們。
  • 內存壓力可能會合理清除內存緩存(例如.UIApplicationDidReceiveMemoryWarning)。

什麼時候存儲在磁盤中的東西會被刪除?

除了(a)它可以在應用程序的調用之間存活)之外,其邏輯與先前的點基本相同;和(b)不會因內存壓力而被刷新,儘管可以在持久存儲設備運行時將其移除。

+0

非常感謝。 「當設備在持久存儲上運行時不會回調」嗎? – Honey

+0

不是我所知道的。 – Rob

相關問題