从后台线程更新主视图 - Swift

时间:2015-07-13 06:06:36

标签: swift grand-central-dispatch dispatch

当我按下按钮时,我开始计算循环,并且需要能够在进展时更新主视图。由于这是后台线程,因此在呼叫完成之前屏幕不会更新。我如何在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];

有什么想法吗?

1 个答案:

答案 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)"
            }
        }
    }
}