Mostrar UIAlertView después de un time

Estoy intentando mostrar un UIAlertView después de algún time (como 5 minutos después de hacer algo en la aplicación). Ya estoy notificando al usuario si la aplicación está cerrada o en segundo plano. Pero quiero mostrar un UIAlertView mientras la aplicación se está ejecutando.

Traté de dispatch_async como sigue pero la alerta está apareciendo para siempre:

[NSThread sleepForTimeInterval:minutes]; dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!" message:@"message!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alert show]; [alert release]; } ); 

Además, leo que el hilo muere después de 30 a 60 minutos. Quiero poder mostrar la alerta después de más de 60 minutos.

¿Por qué no utilizar un NSTimer , por qué necesitaría usar GCD en este caso?

 [NSTimer scheduledTimerWithTimeInterval:5*60 target:self selector:@selector(showAlert:) userInfo:nil repeats:NO]; 

Luego, dentro de la misma class, tendrías algo como esto:

 - (void) showAlert:(NSTimer *) timer { UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!" message:@"message!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alert show]; [alert release]; } 

Además, como señaló @PeyloW , puede usar performSelector:withObject:afterDelay: too:

 UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!" message:@"message!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alert performSelector:@selector(show) withObject:nil afterDelay:5*60]; [alert release]; 

EDITAR Ahora también puede usar la API dispatch_after de GCD:

 double delayInSeconds = 5; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title!" message:@"message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alertView show]; [alertView release]; //Obviously you should not call this if you're using ARC }); 

Este es el tipo de cosa para la que se crearon Notificaciones locales. Puede configurar una notificación similar a UIAlertView para que aparezca en algún momento en el futuro, incluso si su aplicación está en segundo plano o no se ejecuta en absoluto.

Aquí hay un tutorial.