2011-09-19 91 views
7

我一直在我的應用程序中使用自定義NSURLProtocol來檢測資源並從緩存目錄加載(如果可用)或重定向回我的應用服務器。但是,我發現關於抽象方法的文檔缺乏,我不確定如何處理我們需要實現的一些抽象方法。NSURLProtocol的抽象方法

我們必須實現:

+ (BOOL)canInitWithRequest:(NSURLRequest *)request 
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request 
- (void)startLoading 
- (void)stopLoading 

canInitWithRequest是容易的,你這是怎麼告訴NSURLProtocol,你會響應該請求。我不知道該怎麼做canonicalRequestForRequest:

startLoading:,我一直在任創建從本地文件我的迴應或synchroniously獲取遠程文件,然後調用client方法:

[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed]; 
[self.client URLProtocol:self didLoadData:responseData]; 
[self.client URLProtocolDidFinishLoading:self]; 

目前還不清楚我是否需​​要調用客戶端協議方法:

- (void)URLProtocol:(NSURLProtocol *)protocol wasRedirectedToRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse 

當我決定從遠程服務器獲取資源(尚未緩存時)。

最後,我還沒有想出什麼用stopLoading:

做如果有人知道更多的東西,預計這些方法去做,你的見解非常讚賞。

回答

5

canonicalRequestForRequest - 從文檔(https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/Reference/Reference.html

「它是由每一個具體協議的實現來定義什麼 ‘規範’的裝置的協議應保證相同的輸入 請求總是產生相同的。規範形式。

實施該方法,當 因爲請求的規範形式被用來查找對象 URL緩存,其執行相等檢查賭注的處理應給予

特別考慮ween NSURLRequest對象。「

所有它的說法是:

確保兩個請求這實際上是相同的網址...結束了使用完全相同的請求字符串

...等等如果有的話,請求一個將返回另一個的預緩存版本。

您應該可以簡單地將請求返回。您可以通過檢查不需要URL編碼的字符(例如,如果有文字短劃線/連字符編碼)來找到它。


wasRedirectedToRequest - 從文檔(https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSURLProtocolClient_Protocol/Reference/Reference.html

「發來指示,該協議 實施已重定向的URL裝載系統(必需)。」

即如果請求通過HTTP重定向代碼(例如30x狀態碼)重定向,您只能調用此方法。

注:程序錯誤計算器意味着我不能鍵入的內容,我想這裏

例如,服務器可能會重定向「HTTP://服務器」到「HTTP://服務器/ index.html的」 - 這回調可以讓你通知接收者它會從一個稍微不同的URL得到一個響應,而不是它所要求的。

同樣,這對於做正確的緩存等是必要的。