В продолжение моего вопроса здесь .
У меня есть метод lotsOfWork (), выполнение которого может занять некоторое время. Пока он работает, пользователь должен дождаться его завершения. Я хотел бы оставить отзыв пользователю, чтобы он (и) увидел, что происходит.
Теперь у меня есть следующий код для запуска моего метода lotsOfWork (), позволяющий ему обновлять метку, показывающую его прогресс:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
DispatchQueue.global(qos: .background).async {
self.lotsOfWork()
}
}
func lotsOfWork() {
for i in 1...10 {
DispatchQueue.main.async {
self.label.text = "Working on item \(i)..."
}
sleep(1) // Simulating lots of work
}
}
}
Но это также означает, что метод lotsOfWork () будет выполняться в фоновой очереди, а не в основной.
Во время работы lotsOfWork () в основной очереди ничего не происходит, кроме как обновить метку. Пользователь ничего не может сделать, кроме как ждать.
Вопрос 1: Это существенная проблема с производительностью? Потребуется ли для завершения работы больше времени?
Вопрос 2: Если это проблема, есть ли способ, чтобы метод lotsOfWork () выполнялся в main, , при этом сохраняя возможность обновления label.text ?
Я пытался использовать DispatchQueue.main.async и даже 2 вложенных DispatchQueue.main.async, но это не обновляет label.text.
Я также пытался использовать setNeedsDisplay () и setNeedsLayout (), но это ничего не меняет.
Не будет проблем с выполнением LotOfWork () в main, потому что пользователь должен дождаться завершения этой работы, прежде чем продолжить. Но я не могу обновить label.text в режиме реального времени, если в функции main запускается lotOfWork ().