Ios NSURL协议';s的抽象方法

Ios NSURL协议';s的抽象方法,ios,cocoa-touch,url,Ios,Cocoa Touch,Url,我一直在应用程序中使用自定义NSURLProtocol来检测资源并从缓存目录加载(如果可用),或者重定向回应用程序的服务器。然而,我发现关于抽象方法的文档是缺乏的,我不确定如何处理我们需要实现的一些抽象方法 我们必须执行: + (BOOL)canInitWithRequest:(NSURLRequest *)request + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request - (void)startLoadi

我一直在应用程序中使用自定义NSURLProtocol来检测资源并从缓存目录加载(如果可用),或者重定向回应用程序的服务器。然而,我发现关于抽象方法的文档是缺乏的,我不确定如何处理我们需要实现的一些抽象方法

我们必须执行:

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
- (void)startLoading
- (void)stopLoading
canInitWithRequest
很简单,这是告诉NSURL协议您将响应此请求的方式

我不知道如何处理
canonicalRequestForRequest:

startLoading:
中,我要么从本地文件创建响应,要么同步获取远程文件,然后调用
客户端
方法:

[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
当我决定从远程服务器获取资源时(当它还没有被缓存时)

最后,我还没有弄清楚如何处理
停止加载:


如果有人知道这些方法的更多功能,我们将非常感谢您的见解。

canonicalRequestForRequest-来自文档()

“由每个具体的协议实现来定义什么 “规范”的意思是。协议应该保证相同的输入 请求总是产生相同的规范形式

在实施该方法时应特别考虑, 因为请求的规范形式用于查找中的对象 URL缓存,一个在 NSURLRequest对象。“

它所说的是:

确保两个请求实际上是相同的URL。。。最终使用完全相同的请求字符串

…以便请求一个将返回另一个的预缓存版本(如果可用)

您只需再次返回请求就可以了。您可以通过检查不需要URL编码但需要URL编码的字符(例如,如果有文字破折号/连字符编码)来解决这个问题


WASDirectedToRequest-来自文档()

“发送以向URL加载系统指示协议 已重定向实现。(必需)

i、 e.只有当请求通过HTTP重定向代码(例如30x状态代码)重定向时,您才调用此命令

注意:STACKOVERFLOW中的bug意味着我不能在这里输入我想要的内容

例如,服务器可能会将“http://server”重定向到“http://server/index.html”-此回调允许您通知接收者,它将从与请求的URL稍有不同的URL获得响应

同样,这对于进行正确的缓存等是必要的