[英]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.