reloadData后调用numberOfRowsInSection太多次

3
我有一个打开表格视图中所有部分的函数。
非常奇怪,当调用 [self.tvChoices reloadData]; 时,我得到了
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 

需要为每个部分(1300)调用而不仅仅是可见的部分。

有什么想法吗?

也许我应该在reloadData之前清除tableview,但我很好奇这种行为为什么会发生。

-(IBAction)multipleTap:(UIGestureRecognizer *)sender {
    NSLog(@"--[%s:%d]",__PRETTY_FUNCTION__,__LINE__);
    NSNumber *value=self.mybooleans[sender.view.tag];
    [self reset_Sections_BooleansTo:@(!value.boolValue)];
    [self.tvChoices reloadData];  <-- 
}

.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

——即使对于不可见的部分也会被调用


你尝试过使用UITableView.reloadSections(_:withRowAnimation:)吗? - quark
我可以尝试。但不太好的是,我将不得不管理哪些部分需要更新。(打开操作会打开每个部分的内容,因此当部分关闭时,我只能看到标题,当我打开所有部分时,可能只有第一部分会出现(其他部分不需要重新加载))。 - Franck
你确定它在调用1300而不是无限循环吗?你可以通过调试器实际检查一下。 - Lucas Huang
有趣。我会看一下。但是不太合理,因为在最后显示标题和单元格...只有第一节/第六个单元格可见。那么为什么可以通过 numberOfRowsInSection 的值为 1300 的部分呢? - Franck
我确认即使在viewdidload中调用[self.tvChoices reloadData];,tableview也会为每个部分(即使是不可见的部分)调用numberOfRowsInSection。问题是我有2400个部分,这需要时间,太多时间了。有什么想法吗?(基于这个事实,您认为我应该创建一个新的stackoverflow问题吗?) - Franck
1个回答

0

这种行为是有道理的,因为表视图需要估计滚动指示器的大小。为了做到这一点,它需要知道表视图中有多少总行数,因此它需要询问每个部分中有多少行。

如果对于您的应用程序来说不会造成重大性能影响,那就不要担心它。担心一个方法被调用的次数并试图减少它,而没有实现显著的性能提升,这是严重的过早优化,往往不值得付出工作和错误。

如果它会影响性能,正如一些评论者所指出的那样,您可以查看 - reloadRowsAtIndexPaths:withRowAnimation:- reloadSections:withRowAnimation: 来仅重新加载需要更新的行/部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接