UIAlertView showが遅延する
UIAlertViewは他のプラットホームで言う所の「ダイアログ」や「メッセージボックス」である。
デスクトップOSでのダイアログやメッセージボックスとは違い、スレッドをブロックせず、モーダルでも無い。そこで処理が止まらないので、RunLoopを使って同期処理にする方法もあるのだが、今回はそうではなく本来の使い方。
UIAlertViewは以下のようなイディオムで簡単に表示できるのだが、
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"タイトル" message:@"メッセージ" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK",@"Cancel",nil] ; [alert show];
このコードの呼び出しネストが深かったり、スレッドを跨いだりするとすぐに表示せずに、[alert show]実行後表示までに数秒かかったりする。
調べた所、私だけではなく他の方も同様な症状に悩んだ方がたくさんおり、以下のように実行を遅らせることで何故かすぐに表示されることが判った。
[self performSelector:@selector(showAfterDelay) withObject:nil afterDelay:0.001]; - (void)showAfterDelay { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"タイトル" message:@"メッセージ" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK",@"Cancel",nil]; [alert show]; }
症状を見た感じではメインスレッドの実行キューに追加される事自体が遅れているような感じだが、delayを使うことで確実にキューに入れて貰えるのだろうか。いずれにしろ、バグっぽい振る舞いではあるな。