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 滚动性能的主要内容,如果未能解决你的问题,请参考以下文章