¿Cómo se muestra un UIAlertView de un bloque en iOS?

¿Cuál es la mejor forma de mostrar un UIAlertView desde un bloque?

Tengo la siguiente acción en mi código:

- (IBAction)connectWithTwitterClicked:(id)sender { ACAccountStore * account = [[ACAccountStore alloc]init]; ACAccountType * accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [account requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) { if (granted == YES){ NSLog(@"Twitter account has been granted"); NSArray * arrayOfAccounts = [account accountsWithAccountType:accountType]; if([arrayOfAccounts count] > 0){ ACAccount * twitterAccount = [arrayOfAccounts lastObject]; NSLog(@"Found twitter Id of [%@]", twitterAccount.username); // continue on to use the twitter Id } else { // no twitter accounts found, display alert to notify user } } else{ NSLog(@"No twitter accounts have been granted"); // no twitter accounts found, display alert to notify user } }]; } 

He intentado estas soluciones hasta ahora:

  1. En cualquiera de las 2 líneas comentadas, cree y muestre directamente un UIAlertView, esto bloquea la aplicación, creo que esto se debe a que el bloque es un process asíncrono y no tiene acceso al subprocess de interfaz de usuario para mostrar la alerta
  2. Creado un NSMutableString fuera del bloque, lo marcó con __block , lo configuró en las líneas comentadas y luego se visualizó después. Problema similar aquí por el cual el bloque se ejecuta de forma asíncrona, por lo que en el momento de mostrar la alerta no hay garantía de que se haya configurado NSMutableString.

¿Puede alguien sugerir una solución? Quiero poder notificar al usuario de alguna manera para que no puedan usar Twitter, o para salir y configurar una count en la configuration del dispositivo.

Gracias

Cree un método que muestre la vista de alerta, luego realice su selector en el hilo principal:

 - (void)showAlertWithTitle:(NSString *)t { [[[[UIAlertView alloc] initWithTitle:t message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil ] autorelease] show]; } 

Llámalo de la siguiente manera:

 [SomeClass dispatchNastyAsyncBlock:^{ // ... do stuff, then [self performSelectorOnMainThread:@selector(showAlertWithTitle:) withObject:@"Here comes the title" waitUntilDone:YES]; }]; 

Esta es la manera GCD de hacerlo:

 [SomeClass dispatchNastyAsyncBlock:^{ // ... do stuff, then dispatch_async(dispatch_get_main_queue(), ^ { [[[[UIAlertView alloc] initWithTitle:t message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil ] autorelease] show]; }); }];