如何在UICollectionView中加载图像更快?

时间:2016-02-22 05:33:56

标签: ios objective-c uicollectionview sdwebimage

我有一系列包含图像完整路径的图像。 我将图像存储在文档目录中。 问题是当我向下滚动图像时,集合视图中的加载时间很慢,因此滚动也很差。 Referencing此代码使其更快。

但问题是图像没有显示在单元格中。 我的集合视图代码是

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    AlbumImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"AlbumImageCell" forIndexPath:indexPath];
    cell.albumImage.image=nil;
    cell.layer.shouldRasterize = YES;
    cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
    if (cell == nil) {
    cell = [[[NSBundle  mainBundle] loadNibNamed:@"AlbumImageCell" owner:self options:nil] objectAtIndex:0];
    }
NSString *path=[documentImage objectAtIndex:indexPath.row];

NSURL *url = [NSURL URLWithString:path];
// note that this can be a web url or file url

ImageRequest *request = [[ImageRequest alloc] initWithURL:url];

UIImage *image = [request cachedResult];

if (image) {
    UIImageView *imageView = (UIImageView *)[cell viewWithTag:127];
    imageView.image = image;
    cell.albumImage.image=image;
} else {
    [request startWithCompletion:^(UIImage *image, NSError *error) {
        if (image && [[collectionView indexPathsForVisibleItems] containsObject:indexPath]) {
            [self.album_ImageView reloadItemsAtIndexPaths:@[indexPath]];
        }
    }];
}
return cell;
}

我在UIImage中得到了null。 请帮我解决这个问题。

4 个答案:

答案 0 :(得分:1)

NSString *path=[documentImage objectAtIndex:indexPath.row];
 NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:path isDirectory:NO];
UIImageView *sample=[[UIImageView alloc] init];
[sample sd_setImageWithURL:fileURL placeholderImage:[UIImage imageNamed:@"PHOTO.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

    if (image == nil) {
        UIImage *localImage = [UIImage imageNamed:@"PHOTO.png"];
        if (localImage == nil) {
            localImage = [UIImage imageNamed:@"PHOTO.png"];
        }

        sample.image = localImage;
    }
    cell.albumImage.image=image;
}];

答案 1 :(得分:-1)

好的,你可以使用它,

如果你想在UICollectionView中快速加载图像使用' EGOImageView',EGOImageView快速下载图像并且滚动灵活,请参考以下链接下载EGOImageView Loader,

  

https://github.com/enormego/EGOImageLoading

下载ZIP文件,然后整合代码中的以下类

  • EGOCahce
  • EGOImageLoader
  • EGOImageButton
  • EGOImageView

如果集成所有类,则将类导入UICollectionView类,

#import "EGOImageView/EGOImageView.h"
#import "EGOImageLoader/EGOImageLoader.h"

如果导入类,则声明下面给出的EGOImageView示例,

@property (retain, nonatomic) EGOImageView *stickerImageView;

在下面的代码中使用&#39 ;-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath'获取网址并粘贴代码,

NSURL *url = [NSURL URLWithString:path];
   if (url)
       [cell.stickerImageView setImageURL:url];
   else
       [cell.stickerImageView setImage:@"placeholderImage"];

为我工作......

答案 2 :(得分:-1)

我强烈建议使用此库,使用NSURL

在集合视图单元格或表视图中加载图像

SDWebImage

据我所知,它是最常用的异步图像下载器之一,可能使用了一些内部缓存机制。您需要根据要显示图像的UI元素使用导入不同的类别标题。在这种情况下,您需要包含

#import <SDWebImage/UIImageView+WebCache.h>

请找到我在下面显示的示例代码,我用它为集合视图单元格中的每个单元格设置图像视图。

NSURL *imageURL = [NSURL URLWithString:@"http://www.you-url-goes-here.png"];

[_sampleImageView sd_setImageWithURL:imageURL placeholderImage:[UIImage defaultPlaceHolderImage] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

        if (image == nil) {
            UIImage *localImage = [UIImage someLocalImage];
            if (localImage == nil) {
                localImage = [UIImage defaultPlaceHolderImage];
            }

            _sampleImageView.image = localImage;
        }
}];

答案 3 :(得分:-1)

Buddy只需使用AFNetworking库。它易于使用,您的图像将很容易获取,它将自动缓存,您的收藏不会卡住。您将获得滚动的高性能 从这里下载https://github.com/AFNetworking/AFNetworking

UIImageView+AFNetworking.h

使用上述类别获取图片