UITableView 滚动性能

Posted

技术标签:

【中文标题】UITableView 滚动性能【英文标题】:UITableView scrolling performance 【发布时间】:2014-05-06 07:43:44 【问题描述】:

我正在尽我最大的努力使用 Instruments 来分析我的应用,并找出我的代码成本高昂的地方。 [self checkVisibleCells] 方法在 scrollViewDidScroll:(UIScrollView *)scrollView 中调用。我在屏幕上看到大约两/三个单元格,具体取决于它们的高度。 然后我确定单元格是否完全可见并将其标记为已读。使用此线程中的答案:Best way to check if UITableViewCell is completely visible

到目前为止,我只能看到self.tableView.visibleCells 需要很长时间。获取visibleCells 真的那么贵吗?有没有更好的方法来做到这一点?

此处为全尺寸截图:https://www.dropbox.com/s/wt8e2uat9t81qt3/Screenshot%202014-05-06%2009.26.25.png

【问题讨论】:

你试过willDisplayCell:UITableView的委托方法吗? 当其他单元格调用willDisplaCell: 时,我想要markAsRead 的单元格可能尚未完全可见 如果我错了,请原谅我,但工具不是告诉你在 checkVisibleCells 上花费的 87% 的时间都花在 self.tableView.visibleCells 上,这可能是有道理的,因为没有太多其他方法继续进行。关键可能是您多久拨打一次checkVisibleCells?如果它表明该方法占用的时间最多 【参考方案1】:

在这种情况下,我能给你的最好建议是明智地了解你何时在tableView 上致电- (NSArray *)visibleCells

scrollViewDidScroll 经常被称为地狱。如果您每次都在tableView 上调用.visibleCells,难怪它会对您的表现产生如此大的影响。

我的建议是,考虑到您显然知道表格视图单元格的高度(无论是在代码中还是在 IB 中声明),我会利用这一点对您有利。请注意,如果您的单元格高度不同,这将不会真正起作用。

首先,在您的 checkVisibleCells 方法中,我会添加以下内容:

- (void)checkVisibleCells

    CGFloat newContentOffsetY = self.tableView.contentOffset.y;
    BOOL tableViewHasScrollFarEnough = newContentOffsetY > lastCheckedContentOffsetY + MysteriousViewControllerTableViewCellHeight;
    tableViewHasScrollFarEnough = tableViewHasScrollFarEnough || self.tableView.contentOffset.y < self.lastCheckedContentOffsetY - MysteriousViewControllerTableViewCellHeight;

    if (tableViewHasScrollFarEnough)
    
        return;
    

    self.lastCheckedContentOffsetY = self.tableView.contentOffset.y;

    // ... the rest of the method

【讨论】:

通过这个小调整显着改变了性能。谢谢。

以上是关于UITableView 滚动性能的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 滚动性能问题

iOS5:UITableView 滚动性能不佳

UITableView 滚动性能

使用内联选择器的 UITableView 滚动性能

下载 JSON 时如何解决 UITableView 滚动性能滞后的问题?

UITableView滚动性能优化