当我按下一个按钮时,我开始一个循环的计算,需要能够更新主视图,因为它的进展。因为这是一个后台线程,所以在调用完成之前屏幕不会更新。我如何在Swift中实现这一点?这是我目前的简化方法,但行不通。
@IBAction func calculatePower(sender: AnyObject) {
for day in 1...365 {
dispatch_async(dispatch_get_main_queue()) {
self.dayLabel.text = "(day)"
}
}
}
我通常在循环中添加一些0,否则它完成得太快,从1到365。
在Cocoa中,我会使用这样的语句:
[self performSelectorOnMainThread:@selector(updateDisplayEnergySunEquator:) withObject:[NSNumber numberWithDouble:distanceFromSun] waitUntilDone:YES];
任何想法?
@IBAction函数在按钮被按下时在主线程中被调用。发生的情况是,闭包在主线程上排队,但主线程忙于处理循环。基本上,你是在一个线程内做异步工作。
要在另一个线程上运行循环,请将其包装在dispatch_async
中并使用另一个队列。
@IBAction func calculatePower(sender: AnyObject) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
for day in 1...365 {
dispatch_async(dispatch_get_main_queue()) {
self.dayLabel.text = "(day)"
}
}
}
}