【发布时间】:2018-11-06 22:31:05
【问题描述】:
有时当自动布局或 UI 更改没有按照我的意愿执行时,我将代码包装到 DispatchQueue.main.async 中并得到解决(例如):
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
DispatchQueue.main.async {
self.tableview.reloadData()
}
}
但是用 (Thread.current) 调试这段代码而没有 DispatchQueue 它告诉我它已经在主线程中但它不能很好地完成动画,只需添加 DispatchQueue.main.async 就可以了。我想知道DispatchQueue.main.async 到底是什么使它起作用。因为我认为它只是让代码在主线程中执行,但如果它已经在主线程中执行,它不应该做任何事情......但是这样它就可以正常工作并且不会产生布局问题。
(我遇到过不同的代码和不同的应用程序,我一直在调试并告诉我已经在主线程中)。
我认为这可能是因为 dispatchQueue 产生了一点延迟,但它在更多不需要延迟的地方发生在我身上(Swift Animate duration not working in CGAffineTransform -> 今天我在没有 dispatchMainQueue 的情况下调试了这个问题,它正在也在主线程中执行,但没有调度它就无法工作)
【问题讨论】:
-
您是在真实设备上进行测试,对吧?您不应该在模拟器上测试线程。此外,如果没有看到您从哪个上下文调用
tableView.reloadData,很难判断该代码是否确实应该已经在主线程上运行。 -
简单来说,当你使用 DispatchQueue.main.async 时,self.tableview.reloadData() 会在一小段延迟后被调用(因为块会在下一个循环中执行)。这就是你与众不同的原因。
-
我已经更新了我的问题,以检查代码是否已经在主线程中运行,我正在打印 Thread.current,它告诉我我在主线程中并检查断点。
-
@trungduc 在延迟不影响stackoverflow.com/questions/50547386/… 的情况下发生在我身上(在这篇文章中,我还调试了动画在主线程中执行而没有添加 DispatchQueue。主要)
-
@DávidPásztor 是的,我在真机上测试(另外,我之前回复过你,没提你)
标签: ios swift multithreading user-interface grand-central-dispatch