为什么重新加载数据导致在之后调用scrollToRow时崩溃?

时间:2018-06-09 08:22:21

标签: ios swift uitableview reloaddata

重新加载数据会导致在其后调用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有所不同?

1 个答案:

答案 0 :(得分:1)

我发现最简单的答案来自GCD Main queue vs Main thread

  

虽然每个应用程序只有一个主线程,但是可以在这一个主线程上执行许多不同的队列。

某些API不仅依赖于在主线程上运行,而且还依赖于主队列,检查当前队列而不是检查当前线程更安全。