重新加载数据会导致在其后调用scrollToRow时崩溃。我必须在DispatchQueue.main.async
中编写这段代码,但是,为什么呢?当我进入主队列时,为什么要说切换到主队列呢?
self.tableView.reloadData()
print(Thread.current). // It is main
self.tableView.scrollToRow(at: indexPathToScroll, at: .top, animated: false)
print(Thread.current). // It is main
错误是:
_contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:usingPresentationValues:]: 第(20)行超出界限(20)的第(20)行。
问题以这种方式解决了:
DispatchQueue.main.async(execute: {
self.tableView.reloadData()
print(Thread.current). // It is main
self.tableView.scrollToRow(at: indexPathToScroll, at: .top, animated: false)
print(Thread.current). // It is main
})
当我在第一个代码中打印时,它在主线程中运行。为什么DispatchQueue.main.async
有所不同?
答案 0 :(得分:1)
我发现最简单的答案来自GCD Main queue vs Main thread
虽然每个应用程序只有一个主线程,但是可以在这一个主线程上执行许多不同的队列。
某些API不仅依赖于在主线程上运行,而且还依赖于主队列,检查当前队列而不是检查当前线程更安全。