1

我正在尝试找到一个简单的教程,用于在滚动时在 uitableview 单元格上异步插入自定义对象,因为我的 uitableview 滚动不顺畅。我已经搜索过,但我只发现图像异步加载没有帮助。我有一个需要异步加载的uiview。在对象加载之前需要进行过多的处理工作,结果滚动不流畅。

任何帮助表示赞赏。

4

1 回答 1

4

这并不像看起来那么难。只有一个警告。即使没有完全加载,您也必须知道单元格的高度。

如果 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;
}
于 2012-05-19T01:43:02.800 回答