2011-09-19 105 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得到一个响应,而不是它所要求的。

同样,这对于做正确的缓存等是必要的。