繁体   English   中英

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

[英]Getting same images in UITableView cell in Dispatch_queue

我正在从服务器添加图像。 我正在使用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];
            });
        });

谢谢你的帮助。

这并不能真正回答您的问题,但可以帮助您改变前进的方向。

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

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

在加载新图像之前,只需重置单元格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]];
                }
            });
        });

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM