gpt4 book ai didi

ios - Dispatch_async 停止 UITableView 重新加载

转载 作者:行者123 更新时间:2023-11-28 22:34:45 25 4
gpt4 key购买 nike

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

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

} );

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

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; 添加模式=假; [槽表重新加载数据];

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

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

最佳答案

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

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

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

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

关于ios - Dispatch_async 停止 UITableView 重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16414901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com