【问题标题】:Updating the main View from a background thread - Swift从后台线程更新主视图 - Swift
【发布时间】:2015-07-13 06:06:35
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 我看过那个帖子 - 我会再看一遍 - 谢谢。

标签: swift grand-central-dispatch dispatch


【解决方案1】:

@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)"
            }
        }
    }
}

【讨论】:

  • 非常感谢 - 看起来很像。当我回到家的机器前进行测试。
  • 这非常有效,并且设置两个层级是有意义的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 2017-11-19
  • 2012-04-24
  • 2013-11-23
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
相关资源
最近更新 更多