0

我有一个案例,我正在使用 dispatch_async() 中的自定义单元格子视图读取 UITableview 的内容,如下所示:

dispatch_async(myQueue, ^ {
    [self filterArrays];
    [self updateSlotData];

} );

在 updateSlotData 内部:我正在尝试访问 uitableviewcell 的子视图,如下所示:

for (int i = 1 ; i <= [slotTable numberOfRowsInSection:0]; i++) {
    SlotDataCell *cell = (SlotDataCell *)[slotTable cellForRowAtIndexPath:[NSIndexPath indexPathForItem:i-1 inSection:0]];
    NSLog(@"iterating inside %i %i %i",[cell.intTF.text length],[cell.toTF.text length],[cell.fromTF.text length]);

    if(![cell.intTF.text length] || ![cell.toTF.text length] || ![cell.fromTF.text length]){

        outdatedTF = [NSString stringWithFormat:@"Slot %i timing",i];
        newSlot = false;
        return NO;

    }

}

在调用重新加载数据时:isDBSelected = false; 添加模式=假;[slotTable 重载数据];

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{



if(tableView == slotTable){
    if(isDBSelected){

        if(addMode){

            return [countArray count] + 1;
        }else{


            return  [countArray count];
        }
    }else{
        NSLog(@"new template creation started");
        return 1;
    }
}
  return  0;
}

表重新加载,第一行初始化为 nil。其他行似乎没有消失。预期结果:仅创建一行。

4

1 回答 1

2

正如评论所述,您正在访问updateSlotData线程上的块内部,并且该例程使用cellForRowAtIndexPath属于 UI 元素的 ,并且在使用时不在主线程上。此外,您不能直接访问不可见的单元格,因为表格不会保留它们,而只会回收几个单元格。

执行此操作的标准方法是创建一个可变数组,该数组与您的表具有相同数量的对象。事实上,您可以在其中创建包含 NSMutableStrings 的数组,并在后台线程上更新字符串值。

当表格在委托方法中请求一个单元格时,您回收或创建一个单元格,然后从表格中访问字符串并更新单元格的字符串。同样,如果值发生变化并且表格没有滚动,那么您可以查看任何给定的行是否可见,如果是,则更新该单元格中的字符串。

请注意,由于您的主线程正在读取该可变数组(和字符串对象),并且您的后台线程正在更新它们,因此您需要使用某种锁来防止获取损坏的数据——为此目的,调度信号机很方便。或者,您可以通过调度到 mainThread 来更新字符串,而不用担心并发访问。

于 2013-05-07T14:01:54.660 回答