18

MBProgressHUDUITableViewの入力中にユーザーを使用するために、「ビジー」アニメーションを表示するために使用しています。メインスレッドをブロックするため、テーブルのUITableView読み込みが完了するまでアニメーションは表示されません。

UITableViewメインスレッドを占有している間にビジーアニメーションを別のスレッドで実行する方法はありますか?

4

1 に答える 1

40

UIKitは、実行ループが現在のサイクルを完了すると描画を行います。つまり、ビュー(MBProgressHUDなど)を構成している場合、変更は次の実行ループの反復まで表示されません。したがって、メインスレッドをブロックして実行ループのスピンを許可しない場合、UIの変更はすぐには表示されません。

バックグラウンドスレッドで作業を実行できない場合は、メインスレッドで長時間実行されるブロッキングタスクを開始する前に、実行ループがそのサイクルを完了するのを許可する必要があります。

これを行うには、次の実行ループの反復で実行をスケジュールします。

// Setup and show HUD here

[self performSelector:@selector(myTask) withObject:nil afterDelay:0.001];

myTaskの最後でHUDを非表示にします。または、実行ループを手動で実行することもできます。

// Setup and show HUD here

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]];

// Insert myTask code here
// Hide the shown HUD here

または(ブロックを使用できる場合)

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void){
    // Insert myTask code here
});
于 2011-04-29T16:17:51.887 に答える