我正在尝试找到一个简单的教程,用于在滚动时在 uitableview 单元格上异步插入自定义对象,因为我的 uitableview 滚动不顺畅。我已经搜索过,但我只发现图像异步加载没有帮助。我有一个需要异步加载的uiview。在对象加载之前需要进行过多的处理工作,结果滚动不流畅。
任何帮助表示赞赏。
我正在尝试找到一个简单的教程,用于在滚动时在 uitableview 单元格上异步插入自定义对象,因为我的 uitableview 滚动不顺畅。我已经搜索过,但我只发现图像异步加载没有帮助。我有一个需要异步加载的uiview。在对象加载之前需要进行过多的处理工作,结果滚动不流畅。
任何帮助表示赞赏。
这并不像看起来那么难。只有一个警告。即使没有完全加载,您也必须知道单元格的高度。
如果 tableView 具有恒定的行高,则设置 tableView.rowHeight。如果您需要动态确定行高,请使用 UITableViewDelegate 的–tableView:heightForRowAtIndexPath:
回调。
然后在-tableView:cellForRowAtIndexPath
出列单元格中,将其设置为某个初始状态,启动 NSOperation 或 GCD 块,最后返回已重置的单元格。
在 NSOperation 或 CCG 块中,您将执行所需的工作,然后回调到主线程以将值设置到单元格中。这是异步单元加载的本质。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// dequeue a cell
// Reset the cell
cell.imageView.image = nil;
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
// Use gcd
dispatch_queue_t queue = dispatch_queue_create("blah blah replace me blah", 0);
dispatch_async(queue, ^{
// Do work in the background
UIImage *image = value1;
NSString *text = value2;
NSString *detailText = value3;
dispatch_async(dispatch_get_main_queue(), ^{
// Back to main thread to set cell properties.
if ([tableView indexPathForCell:cell].row == indexPath.row) {
cell.imageView.image = image;
cell.textLabel.text = text;
cell.detailTextLabel.text = detailText;
}
});//end
});//end
dispatch_release(queue);
// Return the reset cell
return cell;
}