使用 dispatch_async 在 UICollectionView 中加载图像

Using dispatch_async to load images in UICollectionView

我正在使用 Parse 来存储图像。我正在尝试异步加载图像,因此它不会干扰 collectionView 滚动。我刚开始使用 dispatch_async,不太确定如何正确实施它。我也研究过延迟加载,但我认为这会起作用。但事实并非如此,collectionView 滚动条断断续续。谢谢

- (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:@"image"];

    if (cell.hasImage == FALSE) {
        dispatch_async(imageQueue, ^{
            NSData *data = [file getData];
                if (data) {
                    dispatch_async(dispatch_get_main_queue(), ^(void){
                        cell.imageView.image = [UIImage imageWithData:data];
                        cell.hasImage = TRUE;
                    });

                }
        });
    }

    return cell;
} 

因为UIImage +imageWithData方法有点阻塞主线程。

dispatch_async(dispatch_get_main_queue(), ^(void){
    cell.imageView.image = [UIImage imageWithData:data];

所以这些行应该如下所示。

UIImage *image = [UIImage imageWithData:data];

dispatch_async(dispatch_get_main_queue(), ^(void){
    cell.imageView.image = image;

此外,在实际显示或渲染 UIImage 对象之前,UIImage 不会立即解码图像。参见 。因此,下面的代码是摆脱不连贯滚动的最佳方法之一。

UIImage *image = [UIImage imageWithData:data];

UIGraphicsBeginImageContext(CGSizeMake(1,1));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), [image CGImage]);
UIGraphicsEndImageContext();

dispatch_async(dispatch_get_main_queue(), ^(void){
    cell.imageView.image = image;