uicollectionview 中的延迟加载

Posted

技术标签:

【中文标题】uicollectionview 中的延迟加载【英文标题】:Lazy loading in uicollectionview 【发布时间】:2015-03-23 07:12:16 【问题描述】:

这是我的 collectionview 的代码,它显示记录但加载真的请告诉我如何在此实现延迟加载,我的项目中也有一个占位符图片

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    CollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MJCell" forIndexPath:indexPath];

// Setup image name
    NSString *url = [[rssOutputData objectAtIndex:indexPath.row]xmllink];
    UIImage *img = nil;
    NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    img = [[UIImage alloc] initWithData:data];

    cell.MJImageView.image = img;
    return cell;

现在它正在工作,但非常非常慢。

【问题讨论】:

使用 SDWebImage 或 AsyncImageView 快速异步加载图像。 异步加载图片。否则 UI 线程必须等待图像被下载。这就是为什么它很慢。 这是我的观点。我将如何做到这一点如何将任何技术应用于我的代码?你能通过我的代码解释一下吗! 请不要使用 Mr Phuc 87 代码!寻找 azat92 答案。并且名称变量以小写字符开头。 【参考方案1】:

使用 GCD 进行延迟加载非常容易。

    // Create a queue for the operations
    dispatch_queue_t queue = dispatch_queue_create("photoList", NULL);

    // Start getting the data in the background
    dispatch_async(queue, ^
        NSData* photoData = [NSData dataWithContentsOfURL:[NSURL URLWithString:object.photoURL]];
        UIImage* image = [UIImage imageWithData:photoData];

        // Once we get the data, update the UI on the main thread
        dispatch_sync(dispatch_get_main_queue(), ^
           cell.photoImageView.image = image;
        );
    );

【讨论】:

【参考方案2】:

最简单的实现方法是使用SDWebImage 库,它可以满足您的需求。有UIImageView 类别允许您修改代码:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    CollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MJCell" forIndexPath:indexPath];

    // Setup image name
    NSString *url = [[rssOutputData objectAtIndex:indexPath.row]xmllink];
    [cell.MJImageView sd_setImageWithURL:[NSURL URLWithString:url]];
    return cell;

【讨论】:

【参考方案3】:
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: @"url.com"]];

UIActivityIndicatorView * indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[yourImageView addSubview:indicator];
indicator.center = yourImageView.center;
[indicator startAnimating];
[yourImageView setImageWithURLRequest:request
                     placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                     success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
                              dispatch_async(dispatch_get_main_queue(), ^(void)
                                        yourImageView.image = image;
                               );

                     [indicator stopAnimating];
                     [indicator removeFromSuperview];

 failure:nil];

【讨论】:

可能值得一提的是,这种方法适用于AFNetworking。【参考方案4】:

也许是因为你的图片太大了 您可以使用 NSThread 进行加载

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    CollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MJCell" forIndexPath:indexPath];
    cell.tag = indexPath.row; //For index
    [NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:cell];
    return cell;


- (void) loadImage:(CollectionViewCell *)cell 
  NSString *url = [[rssOutputData objectAtIndex:cell.tag]xmllink];
    UIImage *img = nil;
    NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    img = [[UIImage alloc] initWithData:data];

    cell.MJImageView.image = img;

【讨论】:

感谢它的工作,但条目不断从一个单元格切换到另一个单元格! 如果图像不可用或尚未加载,我该如何使用占位符图像 在collectionView:cellForItemAtIndexPath:上,可以设置一个默认图片'invailable',当线程加载完图片后,新的图片会替换掉。 请不要使用此代码!加载到主队列时必须设置图像!!寻找@azat92 的答案。 SDWebImage 还允许您在使用集合视图时提高性能。 E.c.:重用单元格时取消图像加载。还有SDWebImage自动缓存图片,准备在后台队列中显示。

以上是关于uicollectionview 中的延迟加载的主要内容,如果未能解决你的问题,请参考以下文章

延迟加载 UICollectionView 图像

UICollectionView 水平滚动延迟加载单元格

使用 SDWebImageManager 在 UICollectionView 中延迟加载图像

将图像从 Parse 加载到 UICollectionView 单元格没有延迟

如何从JSON加载特定数据并显示UICollectionView?

UICollectionView 中的 UIView 渐变颜色未正确呈现