仅加载图像'一次'进入UICollectionView单元格

时间:2015-07-15 21:24:49

标签: ios objective-c asynchronous uicollectionview

我将UIImageView子类化为异步加载图像,不会影响UICollectionView滚动性能。虽然这确实有效,但它会流畅地滚动并且图像不会重复,每次用户向上或向下滚动时都会getDataInBackgroundWithBlock。我想知道它是否可能只加载一次图像而没有一个恒定的调用来滚动时获取数据。我正在使用Parse作为数据库。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
albumImageCell *cell = (albumImageCell *) [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

    if (cell == nil) {
        cell = [[albumImageCell alloc]init];
    }


    PFObject *temp = [_dataArray objectAtIndex:indexPath.row];
    PFFile *file = [temp objectForKey:@"imageThumbnail"];

    [cell.imageView setFile:file];

    return cell;
}

自定义ImageView -

- (void) setFile:(PFFile *)file {

    NSString *requestURL = file.url; // Save copy of url locally (will not change in block)
    [self setUrl:file.url]; // Save copy of url on the instance

    self.image = nil;
    [file getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
        if (!error) {
            NSLog(@"GETTING DATA AGAIN");
            dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
                //Background Thread
                UIImage *image = [UIImage imageWithData:data];
                dispatch_async(dispatch_get_main_queue(), ^(void){
                    //UI Updates
                    if ([requestURL isEqualToString:self.url]) {
                        [self setImage:image];
                        [self setNeedsDisplay];
                    }
                });
            });
        } else {
            NSLog(@"Error on fetching file");
        }
    }];
}

可能是preparseForReuse中的某些内容?我也试过像if(image == nil)这样的东西,然后加载数据,但不起作用。

1 个答案:

答案 0 :(得分:0)

我强烈建议您将SDWebImage用于此目的。它是一个防弹库,负责下载和缓存网页图像。如果您非常快速地滚动到列表,它也会取消运行请求。

https://github.com/rs/SDWebImage