Обновление основного представления из фонового потока — Swift

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

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

Обычно я добавляю в цикл несколько нулей, иначе он слишком быстро завершается, переходя от 1 к 365.

В Cocoa я бы использовал такое выражение:

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

Любые идеи?


person Edward Hasted    schedule 13.07.2015    source источник
comment
Я посмотрел эту тему - я пересмотрю ее - спасибо.   -  person Edward Hasted    schedule 13.07.2015


Ответы (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)"
            }
        }
    }
}
person Hendrik Poernama    schedule 13.07.2015
comment
Большое спасибо - похоже на то. Проверю, когда вернусь домой перед машиной. - person Edward Hasted; 13.07.2015
comment
Это отлично работает и имеет смысл настроить два уровня. Спасибо. - person Edward Hasted; 14.07.2015