Objective c 滚动时在uitableview单元格上异步加载自定义对象的任何简单教程

Objective c 滚动时在uitableview单元格上异步加载自定义对象的任何简单教程,objective-c,uitableview,asynchronous,Objective C,Uitableview,Asynchronous,我试图找到一个简单的教程,在滚动时在uitableview单元格上异步插入自定义对象,因为我的uitableview滚动不顺畅。我已经搜索过了,但我只找到了一些关于异步加载的图片,没有任何帮助。我有一个uiview,需要异步加载。加载对象之前需要进行太多的处理工作,因此滚动不平滑 感谢您的帮助。这并不像看上去那么难。只有一个警告。即使电池未满载,您也必须知道电池的高度 如果tableView具有恒定的行高,则设置tableView.rowHeight。如果需要动态确定行高,请使用UITableV

我试图找到一个简单的教程,在滚动时在uitableview单元格上异步插入自定义对象,因为我的uitableview滚动不顺畅。我已经搜索过了,但我只找到了一些关于异步加载的图片,没有任何帮助。我有一个uiview,需要异步加载。加载对象之前需要进行太多的处理工作,因此滚动不平滑


感谢您的帮助。

这并不像看上去那么难。只有一个警告。即使电池未满载,您也必须知道电池的高度

如果tableView具有恒定的行高,则设置tableView.rowHeight。如果需要动态确定行高,请使用UITableViewDelegate的
–tableView:heightForRowAtIndexPath:
回调

然后在
-tableView:cellForRowAtIndexPath
中,将单元格出列,将其设置为某个初始状态,启动NSO操作或GCD块,最后返回已重置的单元格

在NSOperation或CCG块中,您将执行所需的工作,然后回调主线程以将值设置到单元格中。这是异步单元加载的本质



这并不像看上去那么难。只有一个警告。即使电池未满载,您也必须知道电池的高度

如果tableView具有恒定的行高,则设置tableView.rowHeight。如果需要动态确定行高,请使用UITableViewDelegate的
–tableView:heightForRowAtIndexPath:
回调

然后在
-tableView:cellForRowAtIndexPath
中,将单元格出列,将其设置为某个初始状态,启动NSO操作或GCD块,最后返回已重置的单元格

在NSOperation或CCG块中,您将执行所需的工作,然后回调主线程以将值设置到单元格中。这是异步单元加载的本质



谢谢你回答杰弗里。如果您能提供一个简单的示例,我将不胜感激。我添加了一个GCD示例
-tableView:cellforrowatinexpath:
。谢谢!如果我是对的,请告诉我……dispatch\u async块中的代码将在后台执行并完成工作,然后是dispatch\u async(dispatch\u get\u main\u queue()将更新主线程上的单元格属性。我的问题是关于何时执行这段代码的返回单元格?它将等待调度完成?这就是我感到困惑的地方。因为如果没有等待,那么我将得到一个没有任何内容的单元格,在调度完成后,我将得到更新的属性。会发生什么en当我向上或向下滚动时?它最初会加载一个空单元格。在分派完成后,它会将数据填充到单元格中(该单元格将自动刷新)。块将保留单元格,直到块完成为止。如果单元格离开屏幕,则没有什么大不了的。数据将在未显示的单元格上更新。注意:我更新了示例,以防止以前发送的数据插入重复使用的单元格中。它假定只有一个节。如果您有多个节要使用表视图,您将需要一个更复杂的检查。基本思想是正确的。立即返回一个空视图。设置一个NSOperation或GCD块来完成这项工作。完成处理后,返回主线程以更新UI。始终在主线程中更新UI!最后一点注意:在对进行更改后,您可能需要调用-setNeedsLayout自定义视图。感谢您回答Jeffery的问题。如果您能提供一个简单的示例,我将不胜感激。我添加了一个GCD示例
-tableView:CellForRowatineXpath:
。谢谢!请告诉我是否正确……dispatch\u async块中的代码将在后台执行并执行工作,然后dispatch\u async(调度获取主队列()将更新主线程上的单元格属性。我的问题是关于何时执行这段代码的返回单元格?它将等待调度完成?这就是我感到困惑的地方。因为如果没有等待,那么我将得到一个没有任何内容的单元格,在调度完成后,我将得到更新的属性。会发生什么en当我向上或向下滚动时?它最初会加载一个空单元格。在分派完成后,它会将数据填充到单元格中(该单元格将自动刷新)。块将保留单元格,直到块完成为止。如果单元格离开屏幕,则没有什么大不了的。数据将在未显示的单元格上更新。注意:我更新了示例,以防止以前发送的数据插入重复使用的单元格中。它假定只有一个节。如果您有多个节要使用表视图,您将需要一个更复杂的检查。基本思想是正确的。立即返回一个空视图。设置一个NSOperation或GCD块来完成这项工作。完成处理后,返回主线程以更新UI。始终在主线程中更新UI!最后一点注意:在对进行更改后,您可能需要调用-setNeedsLayout一个自定义视图。这里有一个很好的问题可以解决这个问题:这里有一个很好的问题可以解决这个问题:
- (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;
}