Pregunta

Estoy tratando de mostrar una UIAlertView después de algún tiempo (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 el fondo. Pero quiero mostrar un UIAlertView mientras la aplicación se está ejecutando.

He intentado dispatch_async de la siguiente manera, pero la alerta está apareciendo 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, he leído que las matrices de hilo después de 30 a 60 minutos. Quiero ser capaz de mostrar la alerta después de más de 60 minutos.

¿Fue útil?

Solución

¿Por qué no utilizar un NSTimer , ¿por qué es necesario el uso de GCD en este caso?

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

A continuación, dentro de la misma clase, que tendría 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 @PeyloW señaló, puede utilizar performSelector:withObject:afterDelay: también:

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 utilizar la API de dispatch_after 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
});

Otros consejos

Este es el tipo de cosas que las notificaciones locales fueron creadas. Se puede establecer una UIAlertView similar a la notificación de llegar algún momento en el futuro, incluso si su aplicación está en segundo plano o no se ejecuta en absoluto.

Aquí es un tutorial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top