Asic Image Loading的UICollectionView dequeueReusableCellWithReuseIdentifier问题

时间:2015-06-15 21:10:17

标签: ios objective-c asynchronous uicollectionview

所以问题很简单。我想制作一个类似Instagram的屏幕,用户可以在从底部向上滚动的同时无限地查看图像。

当用户到达底部时,我设法下载下一页的图像。 我在dequeueReusableCellWithReuseIdentifier中使用cellForItemAtIndexPath,我使用 AsyncImageView Library异步下载图片。

问题是 - 向上/向下滚动时,单元格中的图像开启/关闭。第一个单元格中的均值显示旧图像,然后在异步下载后显示新图像。我想要一个像Instagram这样的平滑效果,其中新的单元格在底部附加为空白单元格,然后加载图像。

这是我的代码。

首先在viewWillAppear

[self.photosCollectionView registerNib:[UINib nibWithNibName:kPhotoCell bundle:nil] forCellWithReuseIdentifier:kCollectionViewCellId];

然后

-(UICollectionViewCell *)collectionView:(UICollectionView *)paramCollView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [paramCollView dequeueReusableCellWithReuseIdentifier:kCellectionViewCellId forIndexPath:indexPath];
    PhotoBO *singlePhoto = [self.photosArray objectAtIndex:indexPath.row];
    [((AsyncImageView *)[cell viewWithTag:10]) setImageURL:[PhotoBL getPhotoURL:singlePhoto]];
    return cell;
}

总结一下,请watch this video of my app在模拟器中运行。

3 个答案:

答案 0 :(得分:0)

你可以这样做:

  1. 仅在NSDefaultRunLoopMode中下载图像,因为当您滚动集合视图时,将在UITrackingRunLoopMode中设置runloop模式。
  2. 缓存下载的图片。
  3. 重复使用时清洁单元格。

答案 1 :(得分:0)

所以我最终得到了以下解决方案

  • 从我的代码中删除了AsyncImageView库。
  • 介绍AFNetworking网络电话和异步图片下载。
  • cellForItemAtIndexPath方法中,在设置新图像之前将单元格图像设置为nil
  • 使用以下UIImageView+AFNetworking方法下载cellForItemAtIndexPath
  • 中的图像

-(void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage;

现在一切都很好。我已经实现了平滑滚动效果,图像开/关问题也解决了。

答案 2 :(得分:0)

SDWebImage是更好的图书馆,可以得到你想要的东西。它有下载和缓存,效果很好。开箱即用,易于集成。

或者,您可以使用FastImageCache + AFNetworking来获得最佳性能和UI的FPS。这将需要更多的代码,但结果令人印象深刻。你真的应该看看它。