Ios 异步TableViewCell数据

Ios 异步TableViewCell数据,ios,objective-c,uitableview,asynchronous,Ios,Objective C,Uitableview,Asynchronous,我有一个自定义的TableViewCell,我从一个异步函数中的数据库获取数据,该函数返回一个UserObject,其中包含我需要的数据。我的问题是cellforrowatinexpath在异步块完成之前返回单元格。我如何解决这个问题 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpl

我有一个自定义的TableViewCell,我从一个异步函数中的数据库获取数据,该函数返回一个UserObject,其中包含我需要的数据。我的问题是
cellforrowatinexpath
在异步块完成之前返回单元格。我如何解决这个问题

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *simpleTableIdentifier = @"ImageWorkoutCellCollapsed";

    ImageWorkoutCellCollapsed *cell = (ImageWorkoutCellCollapsed *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if(cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ImageWorkoutCellCollapsed" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    WorkoutObject *workout = [[WorkoutObject alloc]init];
    workout = [appDelegate.workoutObjectsArray objectAtIndex:indexPath.row];

    cell.workoutTitle.text = workout.workoutTitle;
    cell.workoutViewCount.text = workout.workoutDescription;

    __block UserObject *cellUserObject = [[UserObject alloc]init];


    [dbPointer getUserObjectFromDB:workout.workoutOwnerID completion:^(UserObject *result)
    {
        cellUserObject = result;
    }];

    cell.userName.text = cellUserObject.username;
    return cell;
}

您应该确保在数据可用之前未调用CellForRowatineXpath。 您有一个行数的计数,必须将该计数设置为N,但尚未获取N个数据项。 在获取所有数据之前,不要设置此数字

当数据到达时,不断更新行数并刷新表视图

返回包含占位符数据的单元格。然后,一旦单元格的实际数据可用,就更新内容并刷新表


上述所有解决方案都涉及将数据提取移出CellForRowatineXpath。但是,如果提取数据的调用很快,因此不会减慢表的绘制速度,则需要将提取从异步转换为同步。但是,对于视图控制器组件来说,直接访问数据库不是一个好的设计,相反,它应该访问一个模型,并且模型应该抽象掉数据库中数据的实现细节。

您应该将单元格更新转换为行的重新加载,如下所示:

1) 您应该使用dequeueReusableCellWithIdentifier:forIndexPath,而不是您正在使用的版本

2) 您不需要检查(cell==nil),因为1)永远不会返回nil

3) 通过WorkUtownerId将新的NSMutableDictionary属性添加到缓存
UserObject

4) 当要求您输入单元格时,请从3)中查找字典,查看它是否包含您的数据对象。如果不是,则运行DB查询。如果有对象,则设置单元格值

5) 在数据库查找的完成处理程序中,通过WorkUtownerId将返回的对象缓存到新字典中。然后简单地请求表重新加载该行

结果是,当单元格所表示的数据更新时,单元格也会更新