为什么 Lable 的文本不能更改,但可以调试 str?



为什么标签的文本不能改变,但可以调试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
// *
}
}
  1. 你在主线程上说queue.sync。所以现在主线程阻塞等待queue完成;没有代码可以在主线程上运行。
  2. 然后说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
}
}

相关内容

  • 没有找到相关文章

最新更新