我对执行方法的顺序有疑问。
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会进入窗口。
我该如何纠正?
答案 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:
委托方法中进行。