メインスレッドでコードを実行している間、UIはそれ自体を更新できません。これは意図的なものであり、パフォーマンスが大幅に向上します。つまり、start
戻るまでUIは更新されません。何度も更新progress
してから戻ってくるので、一度描画されます。
あなたが話していることを達成するために、タイマーまたはGCDキューを使用する必要があります。コードの残りの部分がどのように見えるかにかなり依存しますが、たとえば60秒以上実行したい場合は、次の1つのアプローチを使用します。
- (IBAction)start:(id)sender{
calculatingProgressBar.progress = 0.0;
int j = 60;
dispatch_time_t now = dispatch_time(DISPATCH_TIME_NOW, 0);
for (int i=0; i<j; i++) {
dispatch_after(dispatch_time(now, i * NSEC_PER_SEC),
dispatch_get_current_queue(),
^{
calculatingProgressBar.progress = (i/j);
});
}
}
これは、60のイベントを設定し、1秒間隔で実行するようにスケジュールします。その後、(まだ実行せずに)戻ります。
NSTimer
またはGCDタイマーなど、他にも多くのアプローチがあります。を使用して、処理をバックグラウンドスレッドに移動することもできますdispatch_async()
。(そのためのコンラッドシュルツの答えを参照してください)