异步图像加载闪烁?

时间:2011-11-06 09:58:43

标签: iphone asynchronous tableview grand-central-dispatch flicker

我尝试过多种异步加载图像的方法,但是他们都有这个问题,包括第三方框架。这让我相信它与我的单元格有关的行索引方法。

无论如何我正在使用Grand Central Dispatch和Blocks异步加载图像,这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomizedCell";

    CustomizedCell *cell = (CustomizedCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (CustomizedCell *)[nib objectAtIndex:0];

    }



    // Configure the cell...

    cell.Label.text = [self.TitleArray objectAtIndex:indexPath.row];    

       dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
       dispatch_async(queue, ^{
           NSString *String = [[self.Array objectAtIndex:indexPath.row];
           NSURL *url = [NSURL URLWithString:String];
           NSData *Data = [NSData dataWithContentsOfURL:url];
           UIImage *Image = [UIImage imageWithData:Data];
           dispatch_sync(dispatch_get_main_queue(), ^{
               cell.ImageView.image = Image;
           });
       });

这似乎加载了图像Asychrnously,但就像我尝试使用第三方libarys,不同的代码等,图像闪烁。我的意思是,当你滚动一个单元格的图像时,似乎闪烁并转换到另一个单元格的另一个图像,然后快速改回来,使它看起来好像在闪烁。这只会在您滚动时发生,通常只会滚动到顶部的两个和底部两个单元格。 有什么想法吗? 如果有人能帮我解决这个问题,我真的很感激!

谢谢!

1 个答案:

答案 0 :(得分:2)

好吧,暂时不要使用GCD,但我发现您的代码存在问题。

您是否随时取消当前流程? 我的意思是,你滚动查看其他单元格,但是已经有一个进程下载(旧的和可重复使用的)单元格的图像,非?也许那是你的“闪烁”问题。

如果是你,我会创建一个UIImageView的子类,并实现一种方法来取消当前连接,如果另一个图像想要加载。

顺便说一下,你可以使用NSOperation& NSOperationQueue,不使用任何第三个库。

祝你好运。