2010-07-23 7 views
15

Vi preguntas similares aquí, pero no pude encontrar una solución a mi problema. Tengo un NSURLConnection simple en hilo principal (al menos yo no he creado otros temas), pero mis métodos de delegado no consigo llamadoNSURLConnection no llama a los métodos delegados

[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease]; 

y no hay métodos llamados, por ejemplo,

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
NSLog(@"didReceiveResponse"); 
} 

self es también un delegado para NSXMLParser, pero creo que no debería ser un problema, ya que tengo este trabajo en mi otra clase en el mismo proyecto. Ya revisé todo 10 veces, pero no puedo encontrar ningún problema.

He visto algunos hack para resolverlo aquí: http://www.depl0y.com/?p=345 pero no me gusta, ¿puede ser que alguien sepa una mejor solución? gracias

Respuesta

27

La única razón por la que sé es un hilo separado (que ya está terminado cuando se llaman los métodos de delegado).

Trate de NSLog(@"Is%@ main thread", ([NSThread isMainThread] ? @"" : @" NOT")); justo antes de la creación de la conexión URL

+0

) Lo cambié a 'NSLog (@" ¿Es el hilo principal% @ ", ([NSThread isMainThread]? @" Sí ": @" NOT "))' y obtiene " Es el hilo principal Sí " – Burjua

+0

así que si la respuesta es sí o no, tengo el mismo problema. Ninguno de los métodos de delegado se llama – zambono

+0

@zambono, inicia la conexión en el hilo principal (o hilo de fondo gestionado manualmente) ? –

4

La liberación automática es peligrosa. Las llamadas al delegado se realizan después de que su función regrese (asincrónicamente). ¿Lo estás reteniendo en otro lado?

+0

problema no está en autorelease ((, hice como Eugenio DePalo sugirió – Burjua

+0

La conexión puede y debe ser liberado inmediatamente después de su asignación y la iniciación Esta no es la razón –

+0

Este. es un error muy común. Tenga cuidado. – Magnus

1

Tienes que release el objeto NSURLConnection en el - (void)connectionDidFinishLoading:(NSURLConnection *)connection devolución de llamada como se señala en la documentación de Apple, no en otra parte:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // Do whatever you want here 

    // Release the connection 
    [connection release]; 
} 

No soltar con autorelease, como se sugiere Lou Franco.

Si no es el problema, entonces tal vez usted tiene que poner en práctica todos los métodos necesarios en la clase delegada:

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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

El delegado es retenido por NSURLConnection por lo que no tiene que preocuparse por eso.

+0

No lo sugirió)), pero de todos modos, eliminé la liberación automática, lo solté en connectionDidFinishLoading, pero no ayuda ((( – Burjua

+0

) La conexión puede y debe ser publicado justo después de su asignación e iniciación. Esta no es la razón. –

+0

Sí, tengo todos estos 4 métodos (( – Burjua

15

intente ejecutar la conexión de hilo principal:

NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request 
             delegate:self startImmediately:NO]; 

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
      forMode:NSDefaultRunLoopMode]; 
[connection start]; 
+0

increíble ... me ayudó también :) – Swati

1

creo que puede haber perdido NSURLConnectionDelegate en el archivo de cabecera de la clase.

Por ejemplo:.

@interface yourClass : NSObject <NSURLConnectionDelegate> 
Cuestiones relacionadas