使用多GCD在TableView中加载图像

时间:2014-04-20 06:37:59

标签: objective-c uitableview grand-central-dispatch

我正在使用Asynchoronous GCD for UITableView在带有回调的“cellForRowAtIndexPath”时加载图像。

在我的tableView中,每行有2个产品(这意味着,在每一行中,我必须使用异步GCD加载2个图像) - >如下:

enter image description here

这里我的代码为load image asynchoronous

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //Some code to init CustomCell
    //Load Label1
    //Load Label2
    //Load image1
    if(product1.thumImgData != nil){
        //Update image from datasource
    } else{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:product1.thumImg]];
            if (imgData) {
                UIImage *image = [UIImage imageWithData:imgData];
                if (image) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        CustomViewProductByCategory *updateCell = (id)[self.tvProduct cellForRowAtIndexPath:indexPath];
                        if (updateCell){
                            product1.thumImgData = imgData;
                            updateCell.imgProduct1.image = image;
                            [updateCell.indicatorProduct1 stopAnimating];
                        }
                    });
                }
            }

        });
    }

    if(product2.thumImgData != nil){
        //Update image from datasource
    } else{
    //load image2
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:product2.thumImg]];
            if (imgData) {
                UIImage *image = [UIImage imageWithData:imgData];
                if (image) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        CustomViewProductByCategory *updateCell = (id)[self.tvProduct cellForRowAtIndexPath:indexPath];
                        if (updateCell){
                            product2.thumImgData = imgData;
                            updateCell.imgProduct2.image = image;
                            [updateCell.indicatorProduct2 stopAnimating];
                        }
                    });
                }
            }

        });
  }

我猜,因为我在cellForRowAtIndexPath中使用2 GCD,所以有时候,我无法加载一些图像。

有人知道如何解决这个问题吗? 请事先提前。

1 个答案:

答案 0 :(得分:0)

问题不在于使用GCD,问题是细胞不能像那样工作。你有一个包含很多行的tableview。拥有tableview行很便宜,单元格并不便宜。因此,iOS将一次又一次地重复使用相同的单元格。它只需要你在屏幕上看到的尽可能多的单元格,而不是你有多少行。

因此,在您的异步代码中, not 尝试加载单元格并设置图像。而是将图像存储在数据模型中,并告诉tableview重绘已更改的tableview的行。