在uicollectionview中延迟加载图像问题

时间:2013-07-25 15:52:44

标签: ios uicollectionview

我是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;
}

这可能是一个愚蠢的问题,但我需要答案..如果有人能回答这个问题,那将会有很大的帮助。 提前谢谢。

4 个答案:

答案 0 :(得分:5)

使用UICollectionView时,您应使用indexPath.item代替indexPath.row

答案 1 :(得分:3)

UICollectionViewUITableView中,单元格会被重复使用,这就是您在调用dequeueReusableCellWithReuseIdentifier的行中获得的内容。因此,您获得了一个较旧的单元格,其中包含分配给它的图像,并且在调用异步调用之前您没有明确地将其设置为nil,它将仍然具有较旧的图像,直到下载并设置新图像。因此,修复方法是将cell.imageview_collectnvw.image分配给nil或占位符图像,直到下载成功为止。此外,管理缓存在内存中的UIImages数组,并根据需要从内存中删除以获得更好的性能。查看SDWebImage,它同时缓存到内存和磁盘,并且据我所见,它具有出色的性能。了解如何在表格或UICollectionView中设置图像加载的良好开端是看看Apple的延迟加载示例。

答案 2 :(得分:0)

您可以使用SDWebImage进行延迟加载。它会异步加载图像然后缓存图像,而不需要一次又一次地加载它

答案 3 :(得分:0)

您必须使用多个部分和行。但是您只使用indexPath.row加载图像,而这可能会因不同的部分而重复。因此,您的部分图像应该是重复的。请确保您的密钥是使用部分和项目生成的。

对于Swift

func getCachedIndexKey(index:NSIndexPath) -> String {
    return "section:\(index.section)item:\(index.item)"
}

此方法将返回唯一键(尽管在字符串中)。请了解情况并准备您自己的唯一索引键(整数)。