从后台线程更新主视图 - 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)"
            }
        }
    }
}