UITableViewCell的子视图在更新基础表后不会立即刷新

时间:2014-09-15 20:45:27

标签: ios uitableview asynchronous addsubview

我已经和这个问题争夺了好几天了。我不是Obj-C专家,但到目前为止我能够找到自己的方式:)

基本上我更新了tableViewController的属性,但它只在更新属性几秒后更新了单元格。我怀疑细胞被回收的问题,但我认为我在我的代码中阻止了它。

作为备注: [event updateThumbs] 是一种在下载许多缩略图并将它们组合在一起创建多个按钮后创建子视图的方法。

这是我的代码。谢谢你的帮助:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EventCell"];
//self.feedEvents is an NSMutableArray containing list of events
Event *event = [self.feedEvents objectAtIndex:indexPath.section];
event.delegate = self;

if (event.thumbsView == nil) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // The following method builds a view by combining subviews of buttons with thumbnails
        // downloaded from back end.
        [event updateThumbs];
        NSLog(@"loaded %@ for cell %ld",event.description,(long)indexPath.section);
        [self.feedEvents replaceObjectAtIndex:indexPath.section withObject:event];
    });
}
if (cell.contentView.subviews.count > 0) {
    [cell.contentView.subviews[0] removeFromSuperview];
}

if (event) {
    [cell.contentView addSubview:event.thumbsView];
}

return cell;}

******* 更新 ****

我认为,我向前移动了一下。我通过在cellForRowAtIndex之外执行a-sync工作来改变代码的结构。它现在发生在调用后端以填充底层属性的方法中。但是,它仍然不起作用。加载数据后,单元格仅更新4到6秒。以下是我现在所做的事情:

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

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EventCell"];
     //self.feedEvents is an NSMutableArray containing list of events
     Event *event = [self.feedEvents objectAtIndex:indexPath.section];
     event.delegate = self;

     if (cell.contentView.subviews.count > 0) {
         [cell.contentView.subviews[0] removeFromSuperview];
     }

     if (event) {
         [cell.contentView addSubview:event.thumbsView];
     }

     return cell;
}

并在同一个类

中调用后端
  [self.feedEvents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        Event *event = (Event *) obj;

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
            //a-sync work
            [event updateThumbs];

            dispatch_async(dispatch_get_main_queue(), ^{
                [self.feedEvents replaceObjectAtIndex:idx withObject:event];
                [self.tableView reloadData];
            });
        });

    }];

0 个答案:

没有答案