滚动时UITableView是滞后的

时间:2015-01-26 18:26:49

标签: ios objective-c uitableview

我有一个UITableView,在滚动过程中变得非常迟钝。 图像保存在JSON(在viewDidLoad中)的数组中,而我在cellForRowAtIndexPath中的图像代码是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"UserDiscountsTableViewCell";

UserDiscountsTableViewCell *cell = (UserDiscountsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];


if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"UserDiscountsTableViewCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}


cell.userDiscountNameLabel.text = [userDiscountName objectAtIndex:indexPath.row];

cell.userDiscountImages.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[userDiscountImages objectAtIndex:indexPath.row]]]];


return cell;

}

我正在使用自定义UITableViewCell。当我用cell.userDiscountImages.image删除部分代码时,一切都很完美。

有人可以告知可能导致延迟滚动的原因吗?

2 个答案:

答案 0 :(得分:1)

你自己回答了你的问题:如果你删除了你设置图像的行,一切正常。这一行需要花费大量时间来处理,并且你在主线程上执行它,你阻止了UI。

尝试使用Grand Central Dispatch将图像初始化发送到后台线程。初始化完成后,您需要返回主线程,然后,您可以进行UI更新。这看起来像这样:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[userDiscountImages objectAtIndex:indexPath.row]]]];

    dispatch_async(dispatch_get_main_queue(), ^{
        UserDiscountsTableViewCell *discountCell = (UserDiscountsTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
        discountCell.userDiscountImages.image = img
    });
});

请注意,在初始化图像后,我不直接在单元格上设置它,我从UITableView取回它:这是因为在图像加载时,单元格可能已被重用在另一个NSIndexPath显示另一个单元格。如果你不这样做,你可能会在错误的单元格中找到错误的图像。

答案 1 :(得分:0)

您的表格视图滞后,因为您在加载图片时正在主线程上执行网络代码。请参阅apple docs:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/index.html#//apple_ref/occ/clm/NSData/dataWithContentsOfURL

这个开源库是处理异步图像加载的好方法:https://github.com/rs/SDWebImage