从后台线程更新主视图 - Swift
Updating the main View from a background thread - Swift
当我按下一个按钮时,我开始了一个计算循环,并且需要能够随着它的进行更新主视图。由于这是一个后台线程,屏幕在调用完成之前不会更新。我如何在 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)"
}
}
}
}
当我按下一个按钮时,我开始了一个计算循环,并且需要能够随着它的进行更新主视图。由于这是一个后台线程,屏幕在调用完成之前不会更新。我如何在 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)"
}
}
}
}