重新加载数据时iOS uitableview冻结

Posted

技术标签:

【中文标题】重新加载数据时iOS uitableview冻结【英文标题】:iOS uitableview freeze when reloadData 【发布时间】:2015-12-06 09:56:57 【问题描述】:

我使用 nsarray 来存储所有 tableview 单元格,在我更新单元格后,我调用了 [tableView reloadData];然后应用程序将被冻结。我怎样才能防止这种情况发生?

================================================ ============================

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    NSUInteger nodeCount = _newsFeeds.count;
    if (cell == nil) 
        CustomCell *customCell = [customCells objectAtIndex:indexPath.row - 1];
        [customCell setDelegate:self];
        [customCell setSelectionStyle:UITableViewCellSelectionStyleNone];
        [customCell displayImages];
        cell = customCell;
    
    return cell;



- (void)getData 
    [[BackendUtil shareInstance] getData];


- (void)updateData:(NSNotification *)notification 
    NSDictionary *userInfo  = notification.userInfo;
    NSMutableArray<Data *> *listOfData = [userInfo objectForKey:@"data"];
    _listOfData = listOfData;

    [self createCustomCell:listOfData completion:^(NSArray *arr) 
        customCells = [arr mutableCopy];
        [_tableView reloadData];
    ];


- (void)createCustomCell:(NSMutableArray<Data *> *)listOfData completion:(void(^)(NSArray *arr))completion 
    NSMutableArray *dummyArr = [[NSMutableArray alloc] init];
    for (int i = 0 ; i < [data count] ; i++) 
        Data *data = [listOfData objectAtIndex:i];
        CustomCell *customCell = [[CustomCell alloc] initWithFrame:CGRectMake(posX, posY, width, height) data:data];
        [dummyArr addObject:customCell];
    
    completion(dummyArr);

【问题讨论】:

您在tableview中加载了哪种类型的数据? 类似于 facebook 的新闻提要,许多文本和一些图像。 CustomCell 类是否有重用标识符?由于您不想重用,因此您的代码无法正常工作。 (出于某种原因;)) 冻结看起来如何...是卡在某个地方还是留下空白视图? 卡在某个地方。重新加载表格大约需要 10 秒,我希望用户在重新加载时可以继续滚动表格。 【参考方案1】:
CustomCell *customCell = [customCells objectAtIndex:indexPath.row - 1];

你为什么在这里递减 indexPath 的行? IndexPaths 已经是从零开始的。当调用此行以获取 tableview 的第一行时,此行将向您的 NSArray 发送一个负索引,这反过来会导致您的应用程序崩溃。

【讨论】:

这是因为在数组中这些单元格之前还有一个自定义单元格 @FaiFabio 在这种情况下,除了执行将导致崩溃的非法操作之外,您的代码在逻辑上是不正确的。在您发布的代码中,我看不到对这个其他自定义单元格的任何引用。你从哪里得到它? 我只是跳过那些不能公开的代码,现在,我的应用程序没有崩溃。重新加载 tableview 时它将被冻结。重新加载过程完成后,它将恢复。 那么您必须在隐藏代码中处理第 0 行的情况,因为您发布的代码肯定会崩溃。当您随机省略代码时,很难猜出任何事情。如果您有大量单元格,则您的 updateData 方法可能会花费太长时间而导致冻结。我可以给你的一点建议是,通过在显示之前将它们粘贴到数组来“预加载”单元格几乎永远不是填充表格视图的方法。必须在 cellForRowAtIndexPath 方法中需要时创建单元格,并且必须使用内置的重用机制完成缓存。 如果您在 UITableView 中使用多个单元格类型,您应该有处理特定单元格类型的案例。此链接可能有助于找出 UITableView 中 2 种不同类型的自定义 UITableViewCells:***.com/questions/1405688/…

以上是关于重新加载数据时iOS uitableview冻结的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITableView 搜索时不重新加载数据

将大数据从本地数据库加载到 UITableview 而无需 ui 冻结

UITableView reloadData在iOS 11中重新出现时崩溃

IOS优化加载图片到UITableView

iOS:重新加载 UITableView 后滑动显示数据

在 ios 的 UITableView 或 UICollectionView 中重新加载数据的最佳位置是啥