2009-08-10 7 views
10

Estoy usando una NSMutableURLRequest para conectarme a un sitio web y obtener una respuesta JSON. Lo estoy haciendo generando la solicitud y luego usando NSURLConnection con un delegado de mi mismo para manejar la conexión asíncrona. He implementado todos los métodos normales de delegado:Manejo de una solicitud de NSURL con tiempo de espera al usar el delegado

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Todo funciona a la perfección con la obtención de datos de nuevo, que trata de los errores que se producen, etc. Sin embargo, con el tiempo de espera en la NSURLRequest establece en 10 segundos Parece que no estoy ser llamado en esos métodos (esperaba que se llamara a didFailWithError). Solo queda ahí para siempre y no tengo ninguna notificación de que haya agotado el tiempo.

Lectura de los documentos API de iPhone No veo ninguna mención de qué debe pasar cuando se agota el tiempo de espera, solo que puede establecer el valor de tiempo de espera. ¿Qué debería pasar? No vi ningún otro método delegado en la API que ayudaría. No tengo que verificar manualmente los tiempos de espera, ¿verdad? ¿Los tiempos de espera solo son para solicitudes sincrónicas?

+0

Corey estoy de acuerdo en que debería obtenerlo en el método didDailWithError, pero nunca se llama. Tanto los puntos de interrupción como los registros dentro de ese método muestran que nunca se solicitó un tiempo de espera excedido. – Parrots

+1

Para obtener más contexto, en caso de que haga una diferencia, estoy usando el método mencionado en la respuesta para http://stackoverflow.com/questions/332276/managing-multiple-asynchronous-nsurlconnection-connections para hacer un seguimiento de las conexiones I tener destacado. – Parrots

+0

Parece que esto podría haber sido un error en el SDK beta de 3.0, porque tan pronto como se lanzó la versión final, funcionó como se esperaba. – Parrots

Respuesta

12

Su tiempo de espera se recibe en este método:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
+0

¿Cómo se puede probar el tiempo de espera? Eso parece ser un controlador genérico de errores. – devios1

+14

Lo encontró: 'error.code == NSURLErrorTimedOut' – devios1

1

Ponga algunas declaraciones de registro en cada método y verifique lo que ofrecen. Cuando se agota el tiempo de espera, definitivamente recibe una notificación en la consola sobre el tiempo de espera. Estoy recibiendo esa notificación. Verifique su código y, si aún tiene problemas, infórmenos.

4

u será br recibir este tipo de iofo:

en qué falló con

error: Error Domain=NSURLErrorDomain Code=-1001 UserInfo=0xed4870 "timed out"

+0

Nota 'NSURLErrorTimedOut = -1001' – devios1

3

El comportamiento de tiempo de espera es un poco peculiar , vea this thread en los foros de desarrolladores de Apple.

+1

¡Ese hilo es genial! ¡Gracias! Tenga en cuenta que el hilo le da una referencia a https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html, que enumera todos los errores en NSURLErrorDomain –

1

Lo que hice fue lo siguiente:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    if (error.code == -1001){ 
     [self showTimeoutAlert];//My method to show dialog with timeout message. 
    } else { 
     [self showInvalidURLAlert];//My method to show dialog with bad URL message. 
    } 
} 

Como se dijo antes -1001 es para el tiempo de espera, en otras pruebas llegué -1003 (por mala URL o no disponible conexión).

Tenía como objetivo tratar el tiempo de espera así que cualquier otra cosa que trate como URL incorrecta.

Cuestiones relacionadas