順便說下NSURLRequest物件,它有個cachePolicy屬性,只要其值為NSURLRequestReloadIgnoringLocalCacheData的話,就不會訪問快取。可喜的是這種情況貌似只有在快取裡沒取到,或是強制重新整理時才可能出現。 實際上NSURLCache本身就有磁碟快取功能,然而在iOS上,NSCachedURLResponse卻被限制為不能快取到磁碟(NSURLCacheStorageAllowed被視為NSURLCacheStorageAllowedInMemoryOnly)。 不過既然知道了原理,那麼只要自己實現一個NSURLCache的子類,然後改寫cachedResponseForRequest:方法,讓它從硬碟讀取快取即可。 於是就開工吧。這次的demo邏輯比較複雜,因此我就按步驟來說明了。 先定義檢視和控制器。 它的邏輯是開啟應用時就嘗試訪問快取檔案,如果發現存在,則顯示快取完畢;否則就嘗試下載整個網頁的資源;在下載完成後,也顯示快取完畢。 不過下載所有資源需要解析HTML,甚至是JavaScript和CSS。為了簡化我就直接用一個不顯示的UIWebView載入這個頁面,讓它自動去發起所有請求。 當然,快取完了還需要觸發事件來顯示網頁。於是再提供一個按鈕,點選時顯示快取的網頁,再次點選就關閉。 順帶一提,我本來想用Google為例的,可惜它自己實現了HTML 5離線瀏覽,也就體現不出這種方法的意義了,於是只好拿百度來墊背。 Objective-c程式碼 收藏程式碼 #import
順便說下NSURLRequest物件,它有個cachePolicy屬性,只要其值為NSURLRequestReloadIgnoringLocalCacheData的話,就不會訪問快取。可喜的是這種情況貌似只有在快取裡沒取到,或是強制重新整理時才可能出現。 實際上NSURLCache本身就有磁碟快取功能,然而在iOS上,NSCachedURLResponse卻被限制為不能快取到磁碟(NSURLCacheStorageAllowed被視為NSURLCacheStorageAllowedInMemoryOnly)。 不過既然知道了原理,那麼只要自己實現一個NSURLCache的子類,然後改寫cachedResponseForRequest:方法,讓它從硬碟讀取快取即可。 於是就開工吧。這次的demo邏輯比較複雜,因此我就按步驟來說明了。 先定義檢視和控制器。 它的邏輯是開啟應用時就嘗試訪問快取檔案,如果發現存在,則顯示快取完畢;否則就嘗試下載整個網頁的資源;在下載完成後,也顯示快取完畢。 不過下載所有資源需要解析HTML,甚至是JavaScript和CSS。為了簡化我就直接用一個不顯示的UIWebView載入這個頁面,讓它自動去發起所有請求。 當然,快取完了還需要觸發事件來顯示網頁。於是再提供一個按鈕,點選時顯示快取的網頁,再次點選就關閉。 順帶一提,我本來想用Google為例的,可惜它自己實現了HTML 5離線瀏覽,也就體現不出這種方法的意義了,於是只好拿百度來墊背。 Objective-c程式碼 收藏程式碼 #import