我正在从服务器添加图片。我正在使用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];
});
});
感谢您的帮助。
答案 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匹配。如果不匹配则不显示;这意味着单元格已被重用(由于滚动或刷新)并且不再需要该图像。无需停止加载图像,只需显示。