Mostrar animation del indicador de actividad cuando se presiona el button

Tengo un button llamado "synchronization". Cuando se toca / presiona, envía datos a un server web y recupera la respuesta del server (lo que toma un time y congela el button gui /), así que ¿cómo agrego un indicador de "Espere por favor" e indicador de actividad hasta que los datos / respuestas del server llega y el text / indicador se elimina y se reemplaza por la respuesta del server?

Este código congela mi aplicación:

- (IBAction) syncButtonTapped { [syncButton setEnabled:NO]; //resultText.text= @"Bitte warten ..."; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDir = [paths objectAtIndex: 0]; NSString *docFile = [docDir stringByAppendingPathComponent: @"deck.txt"]; NSString *post = [NSString stringWithContentsOfFile:docFile encoding:NSUTF8StringEncoding error:nil]; NSString *post2 = [post stringByReplacingOccurrencesOfString:@"\n" withString:@","]; NSString *post3 = [post2 stringByReplacingOccurrencesOfString:@"\r" withString:@""]; NSString *post4 = [NSString stringWithFormat:@"{\"results\":[%@]}",post3]; NSString *urlString = [NSString stringWithFormat:@"http://storecheck.cortona.de/fetchresults.php?results=%@",[post4 stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding]]; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"GET"]; NSString *data4 = @""; [data4 writeToFile: docFile atomically: NO encoding: NSUTF8StringEncoding error:nil]; //send request & get response NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; } 

Estoy trabajando en un Mac Mini con iOS 10.6.7

Su request síncrona bloquea el subprocess de la interfaz de usuario y es por eso que el indicador de actividad no se iniciará. Debe utilizar NSURLConnection de forma asíncrona por múltiples razones, y esa es una de ellas.

En lugar de:

 NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

Hacer:

 NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [conn start]; [conn release]; 

Luego, haga que la variable de instancia returnData e implemente los methods NSURLConnectionDeletgate:

 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { returnData = [[NSMutableData alloc] init]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [returnData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; // do whatever you need with your string and stop activity indicator [returnData release]; } 

Agregar un indicador de actividad en UIAleartView ayudará. Mira esto…

 UIAlertView *waitAlert = [[[UIAlertView alloc] initWithTitle:@"Please Wait...." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; [waitAlert show]; UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; // Adjust the indicator so it is up a few pixels from the bottom of the alert indicator.center = CGPointMake(waitAlert.bounds.size.width / 2, waitAlert.bounds.size.height - 50); [indicator startAnimating]; [waitAlert addSubview:indicator]; [indicator release]; 

EDITAR: Probablemente la razón por la cual su aplicación se bloquea es este método

sendSynchronousRequest:(NSURLRequest *)request

La siguiente es la descripción del método.

Se construye una carga síncrona sobre el código de carga asíncrona disponible por la class. El hilo de llamada está bloqueado mientras que el sistema de carga asíncrona realiza la carga de URL en un hilo generado específicamente para esta request de carga. No se necesita una configuration especial de subprocesss o ciclos de ejecución en el subprocess de llamada para realizar una carga síncrona.

Si no desea que la aplicación bloquee, llame a esto desde otro subprocess. Lea también lo siguiente.

Importante: dado que esta llamada puede tardar varios minutos en fallar (especialmente cuando se usa una networking celular en iOS), nunca debe llamar a esta function desde el hilo principal de una aplicación GUI.

Consulte Referencia de class de NSURLConnection. Los dos bloques anteriores se toman de eso.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

Para uso sincrónico: (mala forma, pero solución de trabajo)

 //Right before the request is made UIActivityIndicatorView* indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [indicatorView setFrame:CGRectMake(0, 0, 16, 16)]; [indicatorView setHidesWhenStopped:YES]; [indicatorView startAnimating]; [self.view addSubview:indicatorView]; // Create your request (synchronously or asynchronously) [self performSelector:@selector(myDoRequest:) withObject:self afterDelay:0.1]; //this gives time for the runloop to complete at least one screen draw.. ... -(void)myDoRequest:(id)sender { // Create your request (synchronously or asynchronously) ... // When request is done [indicatorView stopAnimating]; [indicatorView release]; } 
 //Right before the request is made UIActivityIndicatorView* indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [indicatorView setFrame:CGRectMake(0, 0, 16, 16)]; [indicatorView setHidesWhenStopped:YES]; [indicatorView startAnimating]; [self.view addSubview:indicatorView]; // Create your request (synchronously or asynchronously) ... // When request is done [indicatorView stopAnimating]; [indicatorView release]; 

Crear:

 spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [spinner setCenter:CGPointMake(kScreenWidth/2.0, kScreenHeight/2.0)]; // I do this because I'm in landscape mode [self.view addSubview:spinner]; // spinner is not visible until started 

Comienzo:

 [spinner startAnimating]; 

Detener:

  [spinner stopAnimating]; 

Cuando hayas terminado, quita el spinner de la vista y suelta.