2015-07-13 46 views
0

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

在可可,我会用类似的语句:

[self performSelectorOnMainThread:@selector(updateDisplayEnergySunEquator:) withObject:[NSNumber numberWithDouble:distanceFromSun] waitUntilDone:YES]; 

任何想法?

+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)" 
      } 
     } 
    } 
} 
+0

非常感谢 - 看起来像。我将在机器前面回家时测试。 –

+0

这是完美的作品,并设置了两层。谢谢。 –