2015-05-20 39 views
0

我有一個自定義的TableViewCell,我從一個異步函數中的數據庫中獲取數據,該異步函數返回具有我需要的數據的UserObject。我的問題是cellForRowAtIndexPath在異步塊完成之前正在返回單元格。我如何解決這個問題?異步TableViewCell數據

- (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; 
} 

回答

0

您應確保cellForRowAtIndexPath在數據可用前未被調用。 您有一定數量的行數,您必須將此計數設置爲N,但您尚未提取N個數據項。 在取回所有數據之前不要設置此號碼。

OR

作爲數據到達不斷更新的行數並刷新表視圖。

返回帶有佔位符數據的單元格。然後,一旦單元的實際數據可用,請更新內容並刷新表格。

OR

所有上述解決方案涉及移動數據取出來的cellForRowAtIndexPath的。不過IFF訪問數據的調用很快,因此不會減慢表的繪製,您需要將提取從異步轉換爲同步。但是,對於視圖控制器組件來說,直接訪問數據庫並不是一個好的設計,它應該轉向模型,模型應該抽象出數據在數據庫中的實現細節。

0

你應該將小區更新到行重載如下:

1)你應該使用dequeueReusableCellWithIdentifier:forIndexPath,而不是你正在使用的版本。 2)你不需要檢查(cell == nil)1)永遠不應該返回nil。

3)通過workoutOwnerID添加一個新的NSMutableDictionary屬性來緩存UserObject's。

4)當您詢問單元格時,從3)查找字典以查看它是否包含您的數據對象。如果沒有,則運行數據庫查詢。如果它具有該對象,請設置單元格值。

5)在數據庫查找的完成處理程序中,通過workoutOwnerID將返回的對象緩存到新字典中。然後簡單地請求表來重新加載行。

結果是,當它們所表示的數據被更新時,單元格被更新。