2011-09-19 11 views
7

He estado usando un NSURLProtocol personalizado en mi aplicación para detectar recursos y cargar desde un directorio de caché, si está disponible, o redirigir de regreso al servidor de mi aplicación. Sin embargo, encuentro que falta documentación sobre los métodos abstractos y no estoy seguro de qué hacer con algunos de los métodos abstractos que debemos implementar.NSURLProtocol's abstract methods

debemos poner en práctica:

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

canInitWithRequest es fácil, así es como se dice al NSURLProtocol que va a responder a esta solicitud.

No tengo ni idea de qué hacer con canonicalRequestForRequest:.

En startLoading:, he estado ya sea creando mi respuesta desde un archivo local o ir a buscar synchroniously un archivo remoto, a continuación, llamar a los client métodos:

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

Es claro para mí si tengo que llamar al cliente método de protocolo:

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

cuando decido a buscar el recurso del servidor remoto (cuando todavía no se ha almacenado en caché).

Por último, aún no he descubierto qué hacer con stopLoading:

Si alguien sabe más de lo que se espera que estos métodos para hacer, sus ideas son muy apreciados.

Respuesta

5

canonicalRequestForRequest - A partir de los documentos (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/Reference/Reference.html)

"Corresponde a cada una implementación del protocolo concreto para definir qué ‘medios canónicos’Un protocolo debe garantizar que la misma petición de entrada siempre produce la misma. forma canónica.

consideración debe prestar especial atención en la aplicación de este método, debido a la forma canónica de una solicitud se usa para buscar objetos en la memoria caché URL, un proceso que realiza comprobaciones de igualdad apuesta ween NSURLRequest objects ".

Todo lo que está diciendo es:

Asegúrese de que dos peticiones que son efectivamente la misma URL ... terminan usando exactamente la misma petición cuerdas

... así ese solicitante devolverá la versión precaché de la otra, si está disponible.

Debería estar bien simplemente devolver la solicitud nuevamente. Podrías perfeccionarlo marcando los caracteres que no necesitan ser URLencoded pero son (por ejemplo, si hay un literal guión/guión codificado).


wasRedirectedToRequest - a partir de los documentos (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSURLProtocolClient_Protocol/Reference/Reference.html)

"Enviado para indicar al sistema de carga URL que la implementación del protocolo se ha redirigido (requerido)."

es decir, SOLAMENTE debe llamar a esto si la solicitud fue redireccionada a través de un código de redirección HTTP (por ejemplo, un código de estado 30x).

NOTA: errores en Stackoverflow quiere decir que no puede escribir lo que quería AQUÍ

Por ejemplo, un servidor puede redirigir "http: // servidor" a "http: // server/index.html" - y esto La devolución de llamada le permite informar al receptor que obtendrá una respuesta de una URL ligeramente diferente a la que solicitó.

Una vez más, esto es necesario para hacer el almacenamiento en caché correcta etc.