Синхронизация остановит текущий поток, пока он не завершит задачу, которую вы ему назначаете.
Async продолжит работу с текущим потоком и выполнитзадание параллельно или после текущего потока.
Почему он имеет непредвиденное поведение?
Это потому, что loadView()
ожидает, что UIView будет назначено свойству view
после его выполнения, что вы делаете с асинхронным выполнением, которое будет выполнено после завершения loadView.
Исключением может быть то, что вы не назначаете UIView вовремя или потому что вы обрабатываете пользовательский интерфейс в своей частной очереди.Пользовательский интерфейс всегда должен обрабатываться в главном потоке .
Ваша переменная que
является частной очередью, и поскольку вы не указали иначе, она указывает на фоновый поток.
Редактирование вашего кода может помочь вам:
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
let que = DispatchQueue.init(label: "testing")
// Executed 3 times
que.sync {
for i in 0...10 {
print(i)
}
}
// Giving me NSException
DispatchQueue.main.async {
let label = UILabel()
label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
label.text = "Hello World!"
label.textColor = .black
view.addSubview(label)
print("Label Added to Text View")
}
self.view = view
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()