我有一个简单的TableViewController填充此方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSInteger row = [indexPath row];
cell.textLabel.text = [[NSString alloc] initWithFormat:@"%d", row];
dispatch_async(dispatch_get_main_queue(), ^{
[cell setNeedsLayout];
});
});
return cell;
}
第一次加载时,数字会正确显示。
当我对视图进行分类时,数字会随机显示(然后正确排序)。
为什么滚动不对数字进行排序?
最佳答案
UIKit
不是线程安全的。您无法在另一线程上设置UIImageView
的图像,因此无法在另一线程上设置UILabel
的文本。尝试以下方法:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSInteger row = [indexPath row];
[cell.textLabel performSelectorOnMainThread:@selector(setText:) withObject:[NSString stringWithFormat:@"%d", row] waitUntilDone:YES];
});
但是,就我个人而言,我根本不理解您为什么要使用调度。从整数创建字符串的开销是最小的,除非幕后进行的处理比您在此处显示的要多。
您可以将其放在而不是调度调用中:
NSInteger row = [indexPath row];
cell.textLabel.text = [NSString stringWithFormat:@"%i", row];
关于ios - iOS上的TableView Async Refresh,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8881935/