gpt4 book ai didi

ios - NSURLProtocol 的抽象方法

转载 作者:可可西里 更新时间:2023-11-01 03:31:59 25 4
gpt4 key购买 nike

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

我们必须实现:

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

canInitWithRequest 很简单,这就是您告诉 NSURLProtocol 您将响应此请求的方式。

我不知道如何处理 canonicalRequestForRequest:

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

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

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

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

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

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

如果有人知道更多这些方法的预期用途,非常感谢您的见解。

最佳答案

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

"It is up to each concrete protocol implementation to define what “canonical” means. A protocol should guarantee that the same input request always yields the same canonical form.

Special consideration should be given when implementing this method, because the canonical form of a request is used to lookup objects in the URL cache, a process which performs equality checks between NSURLRequest objects."

它的意思是:

Make sure that two requests that are EFFECTIVELY the same URL ... end up using EXACTLY the same request-string

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

您应该可以简单地再次返回请求。您可以通过检查不需要进行 URL 编码但需要进行编码的字符(例如,是否存在文字破折号/连字符编码)来对其进行优化。


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

"Sent to indicate to the URL loading system that the protocol implementation has been redirected. (required)"

即只有在请求通过 HTTP 重定向代码(例如 30x 状态代码)重定向时才调用它。

注意:STACKOVERFLOW 中的错误意味着我无法在此处输入我想要的内容

例如,服务器可能会将“http://server”重定向到“http://server/index.html”——这个回调可以让您通知接收者它将从一个稍微不同的 URL 获得响应比它要求的那个。

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

关于ios - NSURLProtocol 的抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7466653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com