2

我试图在一段时间后显示 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 多分钟后显示警报。

4

2 回答 2

12

为什么不使用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 的dispatch_afterAPI:

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
});
于 2011-01-04T19:41:49.477 回答
0

这就是创建本地通知的目的。你可以设置一个类似于 UIAlertView 的通知在未来某个时间出现,即使你的应用程序是后台的或根本没有运行。

是一个教程。

于 2011-01-04T21:58:41.420 回答