Почему перезагрузка данных вызывает сбой при вызове scrollToRow после него? - PullRequest
0 голосов
/ 09 июня 2018

Перезагрузка данных вызывает сбой при вызове 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:]: row(20) за пределами (20) для секции (0).

Проблема была решена следующим образом:

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 голосов
/ 09 июня 2018

Самый простой ответ, который я нашел, - Основная очередь GCD и Основной поток

Хотя каждое приложение когда-либо будет иметь только один основной поток, возможно выполнение множества различных очередей.в этом главном потоке.

Некоторые API-интерфейсы зависят не только от запуска в основном потоке, но и от основной очереди, безопаснее проверять текущую очередь вместо проверки текущего потока.

...