2015-07-13 2 views
0

Когда я нажимаю кнопку, я начинаю цикл вычислений и должен иметь возможность обновлять основной вид по мере его продвижения. Поскольку это фоновый поток, экран не обновляется до завершения вызова. Как достичь этого в Swift? Это мой текущий, упрощенный подход, который не работает.Обновление основного вида из фоновой темы - Swift

@IBAction func calculatePower(sender: AnyObject) { 
    for day in 1...365 { 
     dispatch_async(dispatch_get_main_queue()) { 
      self.dayLabel.text = "\(day)" 
     } 
    } 
} 

Я обычно добавить некоторые 0s на петлю в противном случае он завершает слишком быстро идущий от всего 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

Это прекрасно работает и имеет смысл настраивать два уровня. Спасибо. –

Смежные вопросы