重新加载数据时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冻结的主要内容,如果未能解决你的问题,请参考以下文章
将大数据从本地数据库加载到 UITableview 而无需 ui 冻结