使用dispatch_sync在uicollectionview上延迟加载

时间:2014-02-13 08:26:50

标签: ios uicollectionview lazy-loading grand-central-dispatch

我希望在处理每张图像后加载太多图像 但当我上下滚动,懒惰加载..
这是我的代码。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell;
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"FaceImageCell" forIndexPath:indexPath];
UIImageView *fImageView = (UIImageView*)[cell viewWithTag:1];
[faceImageView setImage:[UIImage imageNamed:@"ic_loading"]];
NSLog(@"Loaded Image row : %d", indexPath.row);

ALAsset *asset;
    asset = [_imageList objectAtIndex:indexPath.row];
    dispatch_async(all_f_d_queue, ^{
        ALAssetRepresentation *representation = [asset defaultRepresentation];
        NSString *filename = [representation filename];
        NSLog(@"%@", filename);
        UIImage *image, *fullImage;
        if ((fullImage = [_fullImageCache objectForKey:filename]) == nil) {
            image = [UIImage imageWithCGImage:[asset thumbnail]
                                             scale:[representation scale]
                                       orientation:(UIImageOrientation)[representation orientation]];
            vector<cv::Rect> f = [ImageUtils findFeature:image minsize:MIN_FACE_SIZE
                                                 withCascade:face_cascade];

            Mat imageMat = [ImageUtils cvMatFromUIImage:image];
            fullImage = [ImageUtils UIImageFromCVMat:imageMat];
            [_fullImageCache setObject:fullImage forKey:filename];
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [fImageView setImage:fullImage];
            [cell setNeedsDisplay];
        });
    });
return cell;
}

由于队列很多,它发生了延迟加载 当加载单元格不可见时,我想停止或取消调度队列 我该如何检测单元格是不可见的以及停止调度队列?
请告诉我。
我可以在android中使用asynctask。但我不知道如何在iOS中实现它。

2 个答案:

答案 0 :(得分:1)

您可以使用NSOperation和NSOperationQueue。 它与dispatchlib几乎相同,但是面向对象。 您可以将工作包装在NSOperation上,然后将其添加到NSOperationQueue。 然后您可以随时取消NSOperation。 可能必须阅读Apple文档以更好地解释这两个类。

答案 1 :(得分:1)

看看this tutorial。它显示了如何使用NSOperationQueue异步下载数据,并在用户滚动并且此单元格不再可见时取消此队列。