我用一个非常简单的设置更新了一下这个问题。
在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”仅在线程完成后才会出现。
无论如何都要处理这个问题?感谢。
答案 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];
});