UILabel.text не изменяется до последнего выполнения цикла For - PullRequest
0 голосов
/ 05 июля 2018

Я бы хотел менять UILabel.text каждую секунду для строки внутри массива.

Для этого я написал следующий код и поместил его в viewDidAppear.

let countdown = ["3", "2", "1", "GO !"]

for i in 0..<countdown.count {
    self.countdownStatus.text = countdown[i]
    sleep(1)
}

Что происходит

UILabel.text не меняется в течение 4 секунд, затем получите последнюю строку массива.

сон (1)

сон (1)

сон (1)

сон (1)

GO!

Что ожидается

3

сон (1)

2

сон (1)

1

сон (1)

GO!

сон (1)

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Чтобы избежать блокировки пользовательского интерфейса, отправьте всю процедуру в глобальную очередь и отправьте часть пользовательского интерфейса в основную очередь.

DispatchQueue.global().async {
    let countdown = ["3", "2", "1", "GO !"]

    for i in 0..<countdown.count {
        DispatchQueue.main.async {
            self.countdownStatus.text = countdown[i]
        }
        sleep(1)
    }
}
0 голосов
/ 05 июля 2018

Не могли бы вы вместо этого попробовать таймер?

Это не проверено.

let myTimer : Timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.performCountdown), userInfo: nil, repeats: false)

let countdown = ["3", "2", "1", "GO !"]
var i = 0
func performCountdown() {
    while i < 4{
        print(countdown[i])
        i = i+1
    }

Вы также можете использовать фоновый поток, это проверено и работает

import Foundation
import UIKit
let countdown = ["3", "2", "1", "GO !"]
DispatchQueue.global(qos: .background).async {
    for i in 0..<countdown.count {
        print(countdown[i])
        sleep(1)
    }

}
...