连续显示多个警报视图:仅显示最后一个警报视图

时间:2016-04-06 10:52:13

标签: ios objective-c

我用一个非常简单的设置更新了一下这个问题。

在appdelegate.h / m,

@property() UIAlertView *dialog;

-(void) showDialog:(NSString *)message {
   if (!dialog) {
      dialog=[[UIAlertView alloc] initWithTitle:xx];
   }
   [dialog performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
}

-(void) dismissDialog {
  if(dialog) {
    [dialog dismissWithClickedbuttonIndex:0 animated:YES];
    dialog=nil;
  }
}

在viewcontroller.m

点击按钮

-(IBAction) clicked:(id)sender {

dispatch_async(dispatch_get_main_queue(), ^{
  AppDelegate *_app = xxx;
  [_app showDialog:@"start1"];
  sleep(10);
  [_app dismissSyncDialog];

  [_app showSyncDialog:@"start2"];
  sleep(10);
  [_app dismissSyncDialog];

  [_app showSyncDialog:@"start3"];
  sleep(10);
  [_app dismissSyncDialog];
});
}

很长一段时间后才会显示最后一个“start3”。

该行为看起来像主线程被冻结,因此“start3”仅在线程完成后才会出现。

无论如何都要处理这个问题?感谢。

2 个答案:

答案 0 :(得分:0)

移动[_app showSyncDialog:@" start"]; inside dispatch async ....如果alertview出现在除main之外的任何其他线程上,它将导致UI挂起

答案 1 :(得分:0)

使用此代码获取主线程。

double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    // some stuff 1

    [self dismissSyncDialog];
    [self showSyncDialog:@"start2"];

    // some other stuff 2

    [self dismissSyncDialog];
    [self showSyncDialog:@"start3"];

    // some other stuff 3

    [self dismissSyncDialog];
});
相关问题