2009-01-10 10 views
5

Estoy siguiendo junto con this useful looking answer to my question.Realización de solicitudes GET y POST desde una aplicación de iPhone - Se necesita aclaración

Parece estar funcionando, pero aquí hay dos preguntas que tengo:

  1. ¿Cómo puedo detectar un error HTTP? ¿Parece que el método didFailWithError no se llama?

ACTUALIZACIÓN:It considers any response a success. Así que supongo que tengo que manejar los errores HTTP en el método didRecieveResponse, pero además de decirle al usuario que hubo un error cuando presiono un error HTTP, ¿necesito detener la conexión de alguna manera? Y/o limpieza?

  1. veo esta línea en la respuesta:
[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

¿Es necesario liberar esa? ¿Dónde, cómo, cuándo?

Respuesta

4

obtendrá el código de estado devuelto en la didReceiveResponse

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    NSHTTPURLResponse *httpResponse; 
    httpResponse = (NSHTTPURLResponse *)response; 
    int statusCode = [httpResponse statusCode]; 
    //statusCode will be the http code returned like 201,500 
} 

Para detener la conexión, use una variable de nivel de clase para la conexión. La mejor manera de hacerlo sería crear un contenedor que envíe solicitudes y reciba respuesta. Convierta su viewcontroller en un delegado de esta clase y cada vez que el didReceiveResponse proporcione un código de estado de error, llame al método apropiado del delegado y detenga la conexión.

He aquí un buen ejemplo de la clase envoltorio

http://kosmaczewski.net/projects/objective-c-rest-client/

3

Sí, debe liberar ese objeto. Vea el Memory Management Programming Guide for Cocoa. Básicamente, si alguna vez crea un objeto con un nombre de método que comienza con alloc o new o contiene copy, se convierte en propietario del objeto y es responsable de liberarlo más tarde. Solo en el caso en que sepa que va a necesitar el objeto hasta la finalización del programa, está bien que no lo libere, en cuyo caso el sistema operativo reclama la memoria cuando finaliza su aplicación.

Si solo necesita el objeto dentro de un alcance pequeño, puede enviarle el mensaje autorelease. Esto lo agregará al grupo de autorrelease. El grupo de autorrellena envía periódicamente un mensaje release a cada objeto en él. Es algo complicado vea la sección en autorelease pools. Por ejemplo:

En este caso, sin embargo, dado que NSURLConnection s son asíncronos, el autorrelleno no funcionará. No sabe exactamente cuándo volverá a llamar a su objeto con datos, por lo que desea asegurarse de que el objeto aún no se haya liberado. La única forma de estar seguro es saber exactamente cuándo ha terminado con el objeto, y luego enviarlo usted mismo un mensaje release.

Todas las diversas init* devuelven un puntero al objeto dado, por lo que sólo se puede hacer:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
... 
// when done with connection: 
[connection release]; 
+0

Eso es lo que pensé. Estoy confundido sobre cómo liberarlo ya que no tiene un nombre? – Greg

0

Respondiendo a la pregunta en su "actualización" ...

Libere de inmediato el NSURLConnection. El objeto de conexión es retenido por NSRunLoop (al que se agrega automáticamente a menos que utilice el constructor startImmediately: NO). Se eliminará automáticamente del bucle de ejecución (y, por lo tanto, se desbloqueará) en caso de error o finalización.

Cuestiones relacionadas