当我滚动时,为什么我的tableview会发抖

时间:2015-06-19 20:03:02

标签: ios uitableview cell

正在使用以下代码设置tablview单元格...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    MyTableviewcell *cell = [tableView dequeueReusableCellWithIdentifier:@"mytableviewcell" forIndexPath:indexPath];

    cell.titleLabel.text = [self.data[indexPath.row] objectForKey:@"node_title"];
    cell.taxonomy1Label.text = [self.data[indexPath.row] objectForKey:@"group"];


    @try {
        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[self.data[indexPath.row] objectForKey:@"image"]]];
        cell.thumbnailImageView.image = [UIImage imageWithData:imageData];

    }
    @catch (NSException * e) {
        NSLog(@"Exception: %@", e);
    }

    return cell;
}

try/catch只是因为它可能会或者可能没有图像,但它甚至在我把它放入之前就已经发生了。似乎在它将单元格出列时存在某种问题。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

如果您熟悉使用第三方库或CocoaPods,但这是一个常见问题,我建议使用https://github.com/rs/SDWebImagehttps://github.com/AFNetworking/AFNetworking,它们具有UIImageView类别方法来处理从中加载图像背景中的URL,而不是主线程中的URL。

例如使用SDWebImage:

[cell.thumbnailImageView sd_setImageWithURL:yourImageURL];

此方法将在后台获取图像,而不是阻塞主线程,并且不会使您的UITableView抖动。

答案 1 :(得分:0)

如前所述,此调用会阻止主线程:

    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[self.data[indexPath.row] objectForKey:@"image"]]];

尚未提及的是处理此类工作的正确方法。

你不能只在GCD电话中包含上述内容,并希望一切顺利。

您需要延迟加载图像并在适当的时候在tableView上填充它们。

处理此问题的最优雅方法是编写自己的 NSOperation

Here是一个教程,任何进一步的问题都让我知道。

答案 2 :(得分:-1)

您正在通过尝试获取图像来阻碍主线程。将您的图像调用放在一个单独的线程中。