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

最新更新