首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLProtocol的抽象方法

NSURLProtocol的抽象方法
EN

Stack Overflow用户
提问于 2011-09-19 05:02:47
回答 1查看 2.3K关注 0票数 7

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

我们必须执行:

代码语言:javascript
复制
+ (BOOL)canInitWithRequest:(NSURLRequest *)request
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
- (void)startLoading
- (void)stopLoading

canInitWithRequest很简单,您可以这样告诉NSURLProtocol您将响应这个请求。

我不知道如何处理canonicalRequestForRequest:

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

代码语言:javascript
复制
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
[self.client URLProtocol:self didLoadData:responseData];
[self.client URLProtocolDidFinishLoading:self];

我不清楚是否需要调用客户端协议方法:

代码语言:javascript
复制
 - (void)URLProtocol:(NSURLProtocol *)protocol wasRedirectedToRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse

当我决定从远程服务器获取资源时(当资源尚未被缓存时)。

最后,我还没有弄清楚如何处理stopLoading:

如果有更多的人知道这些方法会做些什么,你的洞察力会受到很大的赞赏。

EN

回答 1

Stack Overflow用户

发布于 2013-04-01 12:44:52

canonicalRequestForRequest -来自文档(https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/Reference/Reference.html)

“每个具体的协议实现都需要定义”规范“的含义,协议应该保证相同的输入请求总是产生相同的规范形式。

在实现此方法时应特别考虑,因为请求的规范形式用于在URL缓存中查找对象,这是一个在NSURLRequest对象之间执行等式检查的过程。“

它的意思是:

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

如果可用的话,...so请求一个将返回另一个预缓存版本。

您应该可以再次返回请求。您可以通过检查哪些字符不需要是URLencoded (例如,如果有文字破折号/连字符编码)来实现这一点。

wasRedirectedToRequest -来自文档(https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSURLProtocolClient_Protocol/Reference/Reference.html)

“发送到URL加载系统,表示协议实现已被重定向。(必需)

也就是说,只有当请求通过HTTP重定向代码(例如,30x状态代码)被重定向时,才会调用它。

注意: STACKOVERFLOW中的BUGS意味着我不能在这里键入我想要的

例如,服务器可能将"http:// server“重定向到"http:// server/index.html”--这个回调允许您通知接收方,它将从一个与它所要求的URL稍有不同的URL获得响应。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7466653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档