gpt4 book ai didi

ios - UITableView reloadData,reloadSections:withRowAnimation:和reloadRowsAtIndexPaths:withRowAnimation的性能:

转载 作者:行者123 更新时间:2023-12-01 16:15:41 26 4
gpt4 key购买 nike

我构建了一个测试目的应用程序,以在重新加载表格视图时测试这三种方法的性能。

enter image description here

//
// ViewController.m
// TableViewSample
//
// Created by Antonio081014 on 8/2/15.
// Copyright (c) 2015 Antonio081014.com. All rights reserved.
//

#import "ViewController.h"

@interface ViewController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) NSArray *listOfCards;
@property (nonatomic, strong) NSIndexPath *selectedIndexPath;
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

NSMutableArray *list = [NSMutableArray array];
for (int i=0; i<15; i++) {
NSString *carName = [NSString stringWithFormat:@"Car%d", arc4random() % 15];
[list addObject:carName];
}
self.listOfCards = list;
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.selectedIndexPath = nil;

UIBarButtonItem *table = [[UIBarButtonItem alloc] initWithTitle:@"Table" style:UIBarButtonItemStylePlain target:self action:@selector(reloadTable:)];
UIBarButtonItem *section = [[UIBarButtonItem alloc] initWithTitle:@"Section" style:UIBarButtonItemStylePlain target:self action:@selector(reloadSection:)];
UIBarButtonItem *indexPath = [[UIBarButtonItem alloc] initWithTitle:@"IndexPath" style:UIBarButtonItemStylePlain target:self action:@selector(reloadRow:)];

self.navigationItem.rightBarButtonItems = @[table, section, indexPath];
// self.navigationController.navigationItem.rightBarButtonItems = @[table, section, indexPath];
}

- (void)reloadTable:(UIBarButtonItem *)barItem
{
[self.tableView reloadData];
}

- (void)reloadRow:(UIBarButtonItem *)barItem
{
[self reloadRowAtIndexPath:self.selectedIndexPath forBarButtonItem:barItem];
}

- (void)reloadSection:(UIBarButtonItem *)barItem
{
[self reloadSectionAt:0 forBarButtonItem:barItem];
}

- (void)reloadRowAtIndexPath:(NSIndexPath *)indexPath forBarButtonItem:(UIBarButtonItem *)barItem
{
if (indexPath) {
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}

- (void)reloadSectionAt:(NSUInteger)section forBarButtonItem:(UIBarButtonItem *)barItem
{
[self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSLog(@"Asking Number of Sections in TableView");
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"Asking Number of Rows in Section");
return self.listOfCards.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

NSString *carName = self.listOfCards[indexPath.row];
cell.textLabel.text = carName;

return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.selectedIndexPath = indexPath;
NSLog(@"Did Select Cell %@", indexPath);
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.selectedIndexPath = nil;
NSLog(@"Did Deselect Cell %@", indexPath);
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Will Display Cell %@", indexPath);
}

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Did End Display Cell %@", indexPath);
}

- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Did Highlight Cell %@", indexPath);
}

@end

记录何时调用三个方法。

重新加载数据
2015-08-03 11:00:51.556 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-11}吗?
2015-08-03 11:00:51.558 TableViewSample [324:90811]是否结束了显示单元格{length = 2,path = 0-10}
2015-08-03 11:00:51.559 TableViewSample [324:90811]是否结束了显示单元格{length = 2,path = 0-9}
2015-08-03 11:00:51.560 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-8}
2015-08-03 11:00:51.560 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-7}吗?
2015-08-03 11:00:51.560 TableViewSample [324:90811]结束了显示单元格{长度= 2,路径= 0-6}
2015-08-03 11:00:51.561 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-5}
2015-08-03 11:00:51.561 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-4}
2015-08-03 11:00:51.562 TableViewSample [324:90811]是否结束了显示单元格{length = 2,path = 0-3}
2015-08-03 11:00:51.563 TableViewSample [324:90811]结束了显示单元格{长度= 2,路径= 0-2}
2015-08-03 11:00:51.563 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-1}吗?
2015-08-03 11:00:51.564 TableViewSample [324:90811]是否结束了显示单元格{length = 2,path = 0-0}
2015-08-03 11:00:51.564 TableViewSample [324:90811]询问TableView中的节数
2015-08-03 11:00:51.565 TableViewSample [324:90811]询问节中的行数
2015-08-03 11:00:51.566 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-0}
2015-08-03 11:00:51.567 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-1}
2015-08-03 11:00:51.567 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-2}
2015-08-03 11:00:51.568 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-3}
2015-08-03 11:00:51.569 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-4}
2015-08-03 11:00:51.569 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-5}
2015-08-03 11:00:51.570 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-6}
2015-08-03 11:00:51.571 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-7}
2015-08-03 11:00:51.572 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-8}
2015-08-03 11:00:51.573 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-9}
2015-08-03 11:00:51.573 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-10}
2015-08-03 11:00:51.574 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-11}

ReloadSection
2015-08-03 11:02:21.641 TableViewSample [324:90811]询问TableView中的节数
2015-08-03 11:02:21.642 TableViewSample [324:90811]询问TableView中的节数
2015-08-03 11:02:21.643 TableViewSample [324:90811]询问节中的行数
2015-08-03 11:02:21.647 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-0}
2015-08-03 11:02:21.649 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-1}
2015-08-03 11:02:21.651 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-2}
2015-08-03 11:02:21.653 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-3}
2015-08-03 11:02:21.655 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-4}
2015-08-03 11:02:21.657 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-5}
2015-08-03 11:02:21.659 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-6}
2015-08-03 11:02:21.662 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-7}
2015-08-03 11:02:21.664 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-8}
2015-08-03 11:02:21.666 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-9}
2015-08-03 11:02:21.669 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-10}
2015-08-03 11:02:21.671 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-11}
2015-08-03 11:02:21.990 TableViewSample [324:90811]结束了显示单元格{长度= 2,路径= 0-0}
2015-08-03 11:02:21.991 TableViewSample [324:90811]结束了显示单元格{长度= 2,路径= 0-1}
2015-08-03 11:02:21.992 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-2}
2015-08-03 11:02:21.992 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-3}
2015-08-03 11:02:21.993 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-4}
2015-08-03 11:02:21.994 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-5}
2015-08-03 11:02:21.994 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-6}
2015-08-03 11:02:21.995 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-7}
2015-08-03 11:02:21.995 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-8}
2015-08-03 11:02:21.996 TableViewSample [324:90811]是否结束了显示单元格{length = 2,path = 0-9}
2015-08-03 11:02:21.997 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-10}
2015-08-03 11:02:21.997 TableViewSample [324:90811]是否结束了显示单元格{length = 2,path = 0-11}

重新加载行
2015-08-03 11:03:00.012 TableViewSample [324:90811]突出显示了单元格{length = 2,path = 0-3}
2015-08-03 11:03:00.015 TableViewSample [324:90811]是否选择了单元格{长度= 2,路径= 0-3}
2015-08-03 11:03:00.907 TableViewSample [324:90811]询问TableView中的节数
2015-08-03 11:03:00.908 TableViewSample [324:90811]询问TableView中的节数
2015-08-03 11:03:00.909 TableViewSample [324:90811]询问部分中的行数
2015-08-03 11:03:00.910 TableViewSample [324:90811]将显示单元格{长度= 2,路径= 0-3}
2015-08-03 11:03:01.217 TableViewSample [324:90811]结束了显示单元格{length = 2,path = 0-3}

因此,从日志中:
[UITableView reloadData]消耗16毫秒。
[UITableView reloadSections:withRowAnimation:]消耗323毫秒。
[UITableView reloadRowsAtIndexPaths:withRowAnimation:]消耗302毫秒。

题:
  • 为什么即使只有一个部分,[UITableView reloadData]也比reloadingSections更有效?
  • 为什么reloadingRowsAtIndexPaths需要那么多时间,而实际上却要花些时间呢?
  • 什么样的工具可以帮助我验证或调试类似的问题?和帮助程序链接参考(如果有)?
  • 谢谢。
  • 最佳答案

    here,苹果说:

    重新加载行会导致表视图向其数据源询问该行的新单元格。该表将新单元格设置为动画,同时将旧行设置为动画。

    似乎,当您调用reloadrowsatindexpaths时,将为该动画初始化一个新的单元格,而我们已经知道的reloadData将在之前重新使用该单元格。

    我认为它可以解释这个问题。

    关于ios - UITableView reloadData,reloadSections:withRowAnimation:和reloadRowsAtIndexPaths:withRowAnimation的性能:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31797939/

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