gpt4 book ai didi

ios - 为什么我的 UITableView 重新加载其所有节标题?

转载 作者:行者123 更新时间:2023-11-29 02:59:52 25 4
gpt4 key购买 nike

我在开发一个用于管理用户任务的应用程序。该应用在 UITableView 中列出任务。一天的任务被分组在一个部分中。部分标题显示日期和当天的任务数:

2014/05/03 -(42 个任务)

NSFetchedResultsController 监控实体“Tasks”。当用户插入一个新任务时,系统会要求他提供一些详细信息,例如日期、时间、描述等。 FRC 识别属性的插入或更改并调用委托(delegate)方法:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView beginUpdates];
}


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
switch(type)
{
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
break;

case NSFetchedResultsChangeMove:
[self.tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
switch(type)
{
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}

我有两个问题:

  1. 性能问题:UITableView 似乎在一对 beginUpdates/endUpdates 之后重新加载整个部分数据。它再次向数据源询问节数、节标题和每个节中的行数。 (但是,它不会再次询问所有单元格,仅当它们发生变化时才询问。)因为我的部分标题显示了上面提到的带有日期和任务数的字符串,这是一个性能问题,因为标题是由NSDateFormatter 和 Core Data 计数查询的组合。

  2. 理解问题:在一对 beginUpdates/endUpdates 之后,UITableView 总是两次请求部分数据!这意味着它连续两次询问有多少节,两次询问每个节的标题,但只询问一次每个节中的行数:

    1 对 beginUpdates/endUpdates 触发器:

    2x numberOfSectionsInTableView

    2x tableView:titleForHeaderInSection:

    1x tableView:numberOfRowsInSection:

最佳答案

遗憾的是,在 beginUpdates 和 endUpdates 中操作表格后,UITableView 会为表格中的每个部分调用 numberOfRowsInSection: 和 titleForHeaderInSection: 是准确的。

对于具有大量部分且每个部分行数不多的表,这消除了删除/插入行而不是仅调用 reloadData 的大部分优势。据我所知,除了实现您自己的自定义表格 View 之外,没有办法避免所有这些委托(delegate)调用。

也就是说,您可以通过删除 titleForHeaderInSection: 的实现来提高性能。相同的功能可以在委托(delegate)的 viewForHeaderInSection: 中实现,它只会在屏幕上显示的部分被调用。这可以将数千次 titleForHeaderInSection 调用减少为少量 viewForHeaderInSection 调用。结合快速预缓存每个部分中的行数的策略,您可以获得合理的性能,即使对于具有 10,000 个或更多部分的表也是如此。

关于ios - 为什么我的 UITableView 重新加载其所有节标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23442062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com