2016-12-21 68 views
0

我已經看到這個問題的幾個職位,我不知道如何得到這個工作。例如,這篇文章NSCachedURLResponse returns object, but UIWebView does not interprets contentUIWebView NSURLCache加載離線數據

建議我們繼承並覆蓋cachedResponseForRequest並在返回緩存響應之前修改NSURLRequest(不知道爲什麼需要這樣做)。

這是代碼,我在我的NSURLCache子類:

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request { 

    NSCachedURLResponse *resp = [super cachedResponseForRequest:request]; 
    if (resp != nil && resp.data.length > 0) { 
     NSDictionary *headers = @{@"Access-Control-Allow-Origin" : @"*", @"Access-Control-Allow-Headers" : @"Content-Type"}; 
     NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:headers]; 
     NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:resp.data]; 
     return cachedResponse; 
    } else { 
     return nil; 
    } 

} 

現在,當我加載通過web視圖的要求,我下線,委託didFailLoadWithError被調用(這是無法加載) ,但在調用委託方法之前,我的cachedResponseForRequest方法被調用,並且緩存的響應有一些html,但我的didFailLoadWithError方法仍然被調用。所以我的問題是,如果我們返回來自NSURLCache的緩存響應,webViewDidFinishLoad應該被調用,如果不是我如何做這項工作?

我有這個在我的didFinishLaunchingWithOptions

NSUInteger cacheSizeMemory = 500*1024*1024; // 500 MB 
NSUInteger cacheSizeDisk = 500*1024*1024; // 500 MB 
NSURLCache *sharedCache = [[CustomCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; 
[NSURLCache setSharedURLCache:sharedCache]; 

這就是我想要的工作流程:

  1. 啓動的應用程序。
  2. 擊出了一些URL(可以說slickdeals.net)
  3. 轉到離線殺死應用
  4. 啓動應用程序
  5. UIWebView嘗試打URL,但設備處於脫機狀態,並返回返回緩存的響應。
  6. 我們顯示緩存的響應。

任何想在我的代碼中需要更改的想法是讚賞!

回答

0

NSURLCache設計用於HTTP一致性緩存,並且經常表現出令人意外的結果。您必須爲自己的用例編寫自己的緩存,並實現自定義的NSURLProtocol以使用它。該協議將響應放入緩存中,並在離線時從緩存中提供。羅布納皮爾對此提出了一個excellent article