2011-12-29 6 views
0

何が起こりたいのですか:アラートボックスが処理(ボタンなし)をポップアップし、メイン処理関数が呼び出され、アラートボックスが消えるとナビゲーションコントローラはシリーズ内の次のビューに移動します。他のビューが変更されているときにUIAlertViewが表示されない

実際に何が起こるか:アプリケーションが処理中にウィンドウがフリーズすると、ナビゲーションコントローラが次のビューに変更されている間にアラートボックスが表示され、すぐに消えます。

この問題を解決するにはどうすればよいですか?

コード: [_navigationController dismissModalViewControllerAnimated:NO]; //カメラが終了します UIAlertView * alert;

alert = [[[UIAlertView alloc] initWithTitle:@"Analyzing\nPlease Wait..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; 
[alert show]; 

[self processImage]; 

[alert dismissWithClickedButtonIndex:0 animated:YES]; 
[self gotoResults]; 
+0

これを使用してください[self performSelector:@(processImage)] – userar

答えて

2
alert = [[[UIAlertView alloc] initWithTitle:@"Analyzing\nPlease Wait..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; 
[alert show]; 

をAlertView呼び出すため

[NSThread detachNewThread: .....] 

を使用することができます、UIイベントはメイン実行ループにプッシュされます。別の機能で他のタスクを処理することができます。たとえば、fooという名前の関数は他のタスクを処理します。 [alert show]を呼び出した後、[self performSelector:@selector(foo) withObject:nil afterDelay:0.1]fooを呼び出します。これにより、アラートビューの表示イベントを処理するために実行ループが実行されます。

- (void)foo { 
    UIAlert *alert = ... ///< come from above 
    [self processImage]; 

    [alert dismissWithClickedButtonIndex:0 animated:YES]; 
    [self gotoResults]; 
} 

編集: あなたは-performSelectorについて読むことができます:withObject:afterDelay:this apple official documentに。あなたはafterDelayのパラメータとして0.0を割り当てることができ、およびドキュメントは言った:

delay


メッセージが送信される前に、最小の時間。 の遅延を0に指定しても、必ずしもセレクタが で実行されるとは限りません。セレクタは依然としてスレッドの実行ループにキューイングされ、 はできるだけ早く実行されます。

+0

これは素晴らしいアイデアのようですが、0.1秒でウィンドウが表示されない可能性がありますか?場合によっては、UIが追いつくのにもっと時間がかかることがありますか?それとも、そうではありませんか? – Jason

+0

私は自分の質問を編集しました。 – AechoLiu

1

[自己processImage]画面フリーズの問題が生じ、メインスレッドで実行されている... ので、あなたが[alert show]を呼び出すときの方法

関連する問題