Отображение UIAlertView через некоторое время - PullRequest
2 голосов
/ 04 января 2011

Я пытаюсь отобразить UIAlertView через некоторое время (например, через 5 минут после выполнения каких-либо действий в приложении). Я уже уведомляю пользователя, если приложение закрыто или находится в фоновом режиме. Но я хочу отобразить UIAlertView во время работы приложения.

Я попытался выполнить dispatch_async следующим образом, но предупреждение появляется постоянно:

[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];
       }
       );

Кроме того, я прочитал, что поток умирает через 30-60 минут. Я хочу отображать предупреждение более чем через 60 минут.

Ответы [ 2 ]

12 голосов
/ 04 января 2011

Почему бы не использовать NSTimer, зачем вам в этом случае использовать GCD?

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

Тогда в том же классе у вас будет что-то вроде этого:

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

Также, как отмечалось @ PeyloW , вы также можете использовать performSelector:withObject:afterDelay::

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];

РЕДАКТИРОВАТЬ Теперь вы также можете использовать GCD API dispatch_after:

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
});
0 голосов
/ 05 января 2011

Для таких вещей были созданы локальные уведомления.Вы можете настроить UIAlertView-подобное уведомление, чтобы оно появлялось в будущем, даже если ваше приложение работает в фоновом режиме или вообще не работает.

Здесь - учебник.

...