Objectivo-C Bloques y scope variable

Me gustaría establecer el valor de un object NSData dentro de mi bloque. ¿Alguien puede hacerme saber que he hecho mal aquí?

 // Data __block NSData *data = nil; [ZSURLConnection performRequestWithUrl:wsdlURL xmlString:xml completionHandler:^(NSData *response, NSError *error) { // Handle the error if (error) { NSLog(@"Error: %@", [error localizedDescription]); } else { data = response; }//end }];//end block if (data) { NSString *d = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; NSLog(@"DATA --- %@", d); } return data; 

¿Por qué no puedo asignar la respuesta a los data y luego recuperarlos fuera de mi bloque?

Porque el bloque se ejecuta de forma asíncrona, después del rest de su método. Vuelva a escribir su código de llamada para que funcione con la carga asíncrona o encuentre una manera de realizar el trabajo del bloque de forma sincrónica. No sé qué es ZSURLConnection , pero compruebe si tiene una versión del método "perform …" que no se ejecuta en segundo plano.

performRequestWithUrl:xmlString:completionHandler: no es un método síncrono. Configura una request asincrónica y luego vuelve inmediatamente. El rest de su método se ejecuta y regresa.

Cuando se completa la request, solo ejecuta su bloque, que asigna data y luego los arroja inmediatamente.

Si fuera un método síncrono, su rutina se bloquearía en espera de una costosa operación de networking. Si esto estuviera en el hilo principal, toda tu aplicación se cuelga. ZSURLConnection (y NSURLConnection ) está diseñada para evitar eso.