当您在主线程上运行代码时,UI 无法自行更新。这是有意的,并且大大提高了性能。这意味着在start
返回之前不会对 UI 进行任何更新。你更新progress
了很多次,然后又回来了,所以它只画了一次。
您将需要使用计时器或 GCD 队列来实现您所说的。这在很大程度上取决于其余代码的外观,但这是一种方法,例如,如果您希望它运行超过 60 秒:
- (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 个事件并安排它们运行一秒钟。然后它返回(还没有运行它们)。
还有很多其他方法,例如NSTimer
GCD 计时器。您还可以使用dispatch_async()
. (请参阅康拉德舒尔茨的回答)