当我按下按钮时,我开始计算循环,并且需要能够在进展时更新主视图。由于这是后台线程,因此在呼叫完成之前屏幕不会更新。我如何在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];
有什么想法吗?
答案 0 :(得分:3)
按下按钮时,在主线程中调用@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)"
}
}
}
}