我是iOS应用开发的新手。我正在处理UICollectionView
的图像延迟加载。图像正在显示,但是当我滚动UICollectionView
时,图像会改变它们的位置,并且图像会重复,所有图像都应该是唯一的。这是我的代码:
- (MyCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CELL" forIndexPath:indexPath];
cell.imageview_collectnvw.layer.cornerRadius=6.0f;
cell.imageview_collectnvw.layer.masksToBounds=YES;
dispatch_queue_t queue = dispatch_queue_create("patientlist",NULL);
dispatch_async(queue, ^{
NSString *str=[[[search_array objectAtIndex:indexPath.row]valueForKey:@"friend"]valueForKey:@"linkedin_photo"];
NSLog(@"cell index path --- is %d",indexPath.row);
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:str]];
dispatch_sync(dispatch_get_main_queue(), ^{
if ([[collectionView indexPathsForVisibleItems] containsObject:indexPath]) {
MyCell *cell = (MyCell*)[collectionView cellForItemAtIndexPath:indexPath];
cell.imageview_collectnvw.image=[UIImage imageWithData:data];
}
[cell setNeedsLayout];
NSLog(@"cell index path main is %d",indexPath.row);
});
});
return cell;
}
这可能是一个愚蠢的问题,但我需要答案..如果有人能回答这个问题,那将会有很大的帮助。 提前谢谢。
答案 0 :(得分:5)
使用UICollectionView
时,您应使用indexPath.item
代替indexPath.row
。
答案 1 :(得分:3)
在UICollectionView
或UITableView
中,单元格会被重复使用,这就是您在调用dequeueReusableCellWithReuseIdentifier
的行中获得的内容。因此,您获得了一个较旧的单元格,其中包含分配给它的图像,并且在调用异步调用之前您没有明确地将其设置为nil,它将仍然具有较旧的图像,直到下载并设置新图像。因此,修复方法是将cell.imageview_collectnvw.image
分配给nil或占位符图像,直到下载成功为止。此外,管理缓存在内存中的UIImages
数组,并根据需要从内存中删除以获得更好的性能。查看SDWebImage
,它同时缓存到内存和磁盘,并且据我所见,它具有出色的性能。了解如何在表格或UICollectionView
中设置图像加载的良好开端是看看Apple的延迟加载示例。
答案 2 :(得分:0)
您可以使用SDWebImage进行延迟加载。它会异步加载图像然后缓存图像,而不需要一次又一次地加载它
答案 3 :(得分:0)
您必须使用多个部分和行。但是您只使用indexPath.row加载图像,而这可能会因不同的部分而重复。因此,您的部分图像应该是重复的。请确保您的密钥是使用部分和项目生成的。
func getCachedIndexKey(index:NSIndexPath) -> String {
return "section:\(index.section)item:\(index.item)"
}
此方法将返回唯一键(尽管在字符串中)。请了解情况并准备您自己的唯一索引键(整数)。