执行方法的顺序

时间:2014-05-07 13:04:54

标签: ios methods uialertview

我对执行方法的顺序有疑问。

if (indexPath.row == 2) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:@"Data will be downloaded"
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];

    if([app getData]){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                        message:@"Data is downloaded."
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }   
}

当我运行此代码段时,我想先显示一个警报视图。但是,它在显示警报视图之前调用getData方法。完成getData方法后,alertView会进入窗口。

我该如何纠正?

3 个答案:

答案 0 :(得分:2)

该函数是异步调用的,因此在第一个警报视图可见之前会调用appData。将您的代码更改为:

if (indexPath.row == 2) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                message:@"Data will be downloaded"
                                               delegate:self
                                      cancelButtonTitle:@"OK"
                                      otherButtonTitles:nil];
[alert show];

} 当用户在第一个警报上按OK时,将调用以下方法,但这意味着当第一个警报可见时,appData的代码将无法启动。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if([app getData]){
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:@"Data is downloaded."
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}   

}

注意:请记住在视图控制器中添加UIAlertViewDelegate

答案 1 :(得分:0)

我没有和我一起使用Xcode,但无论如何我都会捅它。您的问题是因为警报不会显示,直到主循环迭代。并且它不会迭代,直到您执行getData方法,因为您在主线程上执行此操作。所以你需要分叉。

尝试将if()包装成以下内容:

dispatch_async(dispatch_get_main_queue(),
^ {
    if([app getData]){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:@"Data is downloaded."
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
        [alert show];
    }   
});

答案 2 :(得分:0)

这是因为运行循环必须继续运行,因此[UIAlertView show]是异步的,不会阻塞当前线程。如果主线程被阻止,则无法传递任何用户界面事件。

如果您希望在第一个警报视图被取消后发生某些事情,请在alertView:clickedButtonAtIndex:委托方法中进行。