Dispatch_async停止的UITableView重装
问题描述:
我在那里我阅读dispatch_async内的UITableView的自定义单元格的子视图的内容(的情况下),如下: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; addMode = false; [slotTable reloadData];
-(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;
}
该表重新加载,第一行被初始化为零。其他行似乎不会消失。预期结果:只创建一行。
答
作为注释状态,您正在线程的块内访问updateSlotData
,该例程使用属于UI元素的cellForRowAtIndexPath
,并且在使用时不在主线程中。此外,您不能直接访问不可见的单元格,因为表格不会保留它们,但只回收几个单元格。
执行此操作的标准方法是创建一个与您的表具有相同数量对象的可变数组。实际上,你可以在其中创建带有NSMutableStrings的数组,并且在后台线程上你可以更新字符串值。
当表在委托方法中请求单元时,您将回收或创建一个单元,然后从表中访问字符串并更新单元格的字符串。同样,如果值发生变化并且表不滚动,则可以看到是否有任何给定行可见,如果是,则更新该单元格中的字符串。
请注意,由于您的主线程正在读取该可变数组(和字符串对象),并且您的后台线程正在更新它们,您需要使用某种锁来防止出现损坏的数据 - 调度semaphone便于实现此目的。或者,您可以通过调度到mainThread来更新字符串,而不必担心并发访问。
任何UI更新都必须位于主线程上。 – Kreiri 2013-05-07 08:58:21
@Kreiri如果UI更新发生在后台线程意味着什么,会发生什么? – Mani 2013-05-07 09:04:38
该线程的EXC_BAD_ACCESS – DesperateLearner 2013-05-07 09:08:15