TableView scrollToRow阻塞了主ui线程

时间:2017-02-23 08:05:26

标签: ios swift uitableview

我有UITableView个约500件。

当我调用tableView.scrollToRow(at: indexPath, at: .bottom, animated: false)时,主UI线程被阻止了3秒钟。

有没有办法解决这个问题?或滚动500项问题?

由于

问题与reloadData

scrollToRow无关

3 个答案:

答案 0 :(得分:2)

从讨论如何使用表格视图进行聊天: 我们可以使用表格视图,它使用变换来翻转Y坐标。然后我们需要为每个单元格做同样的操作,这样它们就不会颠倒过来。

该过程是构建一个正常的消息传递表视图,其中最新消息位于顶部(而不是底部)。然后将表视图放在某个超视图上并反转其坐标系:

chatContainer?.transform = CGAffineTransform(scaleX: 1.0, y: -1.0)

包含消息的单元格还应该包含需要翻转的所有内容的某种超级视图:

    override func awakeFromNib() {
        super.awakeFromNib()

        containerView?.transform = CGAffineTransform(scaleX: 1.0, y: -1.0)
    }

因此,细胞基本上翻转两次,以便正确显示。

您可以找到示例项目here

答案 1 :(得分:0)

使用时间分析器确定问题的确切位置。问题是,UITableView性能通常不会受到加载的大量项目的影响。视图本身将加载尽可能多的项目以填充整个屏幕。

您可以通过在cellForRowAtIndexPath中记录方法来对此进行测试。所以我猜这个方法可能很慢。检查如何从中访问数据,可能有一些重要的逻辑。或者单元格布局可能会被窃听并且非常慢。

在一般情况下,如果您有非常大量的数据,请考虑使用核心数据和专为此情况设计的NSFetchedResultsController。但是请注意,在表视图中加载500个元素应该可以顺利运行,无需任何特殊优化。

答案 2 :(得分:0)

我对此解决方案并不是100%肯定,我自己也没有遇到过这个问题。 也许只是派遣它?

extension UITableView {

func tableViewScrollToBottom(animated: Bool) {

        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {

            let numberOfSections = self.numberOfSections
            let numberOfRows = self.numberOfRows(inSection: numberOfSections-1)
            if numberOfRows > 0 {
                let indexPath = IndexPath(row: numberOfRows-1, section: (numberOfSections-1))
                self.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: animated)
            }
        }
    }
}