我有一个简单的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/

10-09 16:24