在UICollectionView中终止Async CGImageRef加载

时间:2012-12-20 17:04:03

标签: ios asynchronous grand-central-dispatch uicollectionview

我有一个集合视图,可以模拟封面流程。它从ALAssetLibrary异步加载图像,如此。

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;
{
    myCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"CELL_ID" forIndexPath:indexPath];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
                       ^{
                           ALAsset *asset = [assets objectAtIndex:indexPath.row];
                           CGImageRef thumbnailImageRef = [[asset defaultRepresentation]fullScreenImage];
                           UIImage *thumbnail = [UIImage imageWithCGImage:thumbnailImageRef];
                           dispatch_async(dispatch_get_main_queue(), ^{
                               cell.myImageView.image = thumbnail;
                           });
                       });

    return cell;
}

如果用户快速滚动,图像需要更长时间才能加载。我想,如果用户快速滚动到图像20,他们必须等待图像1-19加载,即使它们不再在屏幕上。所以,我的问题是,如果在加载过程完成之前单元格离开屏幕,是否有办法停止图像加载?

1 个答案:

答案 0 :(得分:1)

排队后,无法取消调度块。我使用NSOperationQueue实现了类似的功能。将调度调用替换为NSOperation子类,这些子类具有标识它们所属的索引路径的属性,并将它们放入操作队列中。然后,在滚动委托回调期间,迭代队列,取消太远的操作。