我正在使用Asynchoronous GCD for UITableView在带有回调的“cellForRowAtIndexPath”时加载图像。
在我的tableView中,每行有2个产品(这意味着,在每一行中,我必须使用异步GCD加载2个图像) - >如下:
这里我的代码为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,所以有时候,我无法加载一些图像。
有人知道如何解决这个问题吗? 请事先提前。
答案 0 :(得分:0)
问题不在于使用GCD,问题是细胞不能像那样工作。你有一个包含很多行的tableview。拥有tableview行很便宜,单元格并不便宜。因此,iOS将一次又一次地重复使用相同的单元格。它只需要你在屏幕上看到的尽可能多的单元格,而不是你有多少行。
因此,在您的异步代码中, not 尝试加载单元格并设置图像。而是将图像存储在数据模型中,并告诉tableview重绘已更改的tableview的行。