为什么标签的文本不能改变,但可以调试str?我知道排队。当我在主线程中睡觉时,同步在主线程中执行。
class ViewController: UIViewController {
let queue = DispatchQueue(label: "queue", qos: .userInteractive)
let sem = DispatchSemaphore(value: 0)
@IBOutlet var label: UILabel!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
for _ in 0..<10 {
queue.sync {
Thread.sleep(forTimeInterval: 2)
let str = String(Int.random(in: 1...10))
debugPrint(str)
DispatchQueue.main.async {
self.label.text = str
}
}
}
}
}
你在阻碍自己。考虑:
queue.sync { // 1
Thread.sleep(forTimeInterval: 2)
DispatchQueue.main.async { // 2
// *
}
}
- 你在主线程上说
queue.sync
。所以现在主线程阻塞等待queue
完成;没有代码可以在主线程上运行。 - 然后说
DispatchQueue.main.async
,要求在主线程上执行关闭(*
)。但是,正如我们刚才所说的,那是不可能的;主线程阻塞,没有代码可以在上面运行。
至于你的debugPrint,它是在queue
上,而不是主线程上,所以没有问题。
(注意:你所做的一切都是非法的。不要阻塞主线程,也不要休眠。)
您正在阻塞等待主线程队列完成任务。所以更新标签文本代码不在主线程上运行。这是因为它没有更新。
尝试使用不会阻塞主线程的异步方法。
queue.async {
Thread.sleep(forTimeInterval: 2)
let str = String(Int.random(in: 1...10))
debugPrint(str)
DispatchQueue.main.async {
self.label.text = str
}
}