在Dispatch_queue中的UITableView单元格中获取相同的图像

时间:2014-11-14 12:39:15

标签: ios objective-c iphone

我正在从服务器添加图片。我正在使用NSMutableArray和自定义UITableViewCell。问题:当我运行项目时。 UITableViewCell显示相同的图像。我觉得它清爽细胞。我该如何解决这个问题?

我使用的调度方法

   dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        //this will start the image loading in bg
        dispatch_async(concurrentQueue, ^{
            NSError *nserror = nil;
            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString: [imagesArray2 objectAtIndex:indexPath.row]]options:NSDataReadingUncached error:&nserror];

            //this will set the image when loading is finished
            dispatch_async(dispatch_get_main_queue(), ^{
                if (nserror)
                {
                    [cell.imgview setImage:[UIImage imageNamed:@"placeholderimage.png"]];
                }
                else
                {
                    [cell.imgview setImage:[UIImage imageWithData:imageData]];
                }
                [mytablview reloadData];
            });
        });

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这并没有真正回答你的问题,但它可能会帮助你改变你前进的方向。

加载完图像后,单元格可能已经开始加载不同的图像,因为UITableView重复使用它们的单元格。异步加载图像并在图像完成后进行设置的操作不会被取消,因此您将在整个商店中弹出不正确的图像,因为没有保证首先完成哪个图像加载。

请参阅我对AFNetworking的评论,我强烈建议您使用,但如果您沿着不同的路径走,那么您应该使用某种NSOperation子类来加载图像。这样,您可以在重复使用单元格时取消操作,然后可以安全地为该单元格加载不同的图像。

答案 1 :(得分:1)

在加载新图片之前,只需重置单元格imageView。

   [cell.imgview setImage:[UIImage imageNamed:@"placeholderimage.png"]];
   dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(concurrentQueue, ^{
            NSError *nserror = nil;
            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString: [imagesArray2 objectAtIndex:indexPath.row]]options:NSDataReadingUncached error:&nserror];
            dispatch_async(dispatch_get_main_queue(), ^{
                if (nserror) {
                    [cell.imgview setImage:[UIImage imageNamed:@"placeholderimage.png"]];
                } else {
                    [cell.imgview setImage:[UIImage imageWithData:imageData]];
                }
            });
        });

答案 2 :(得分:0)

将网址保存在最终会显示图片的单元格中。然后,当您尝试在图像到达后显示图像时,请确保单元格中的URL与您要显示的图像的URL匹配。如果不匹配则不显示;这意味着单元格已被重用(由于滚动或刷新)并且不再需要该图像。无需停止加载图像,只需显示。