我希望在处理每张图像后加载太多图像
但当我上下滚动,懒惰加载..
这是我的代码。
- (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中实现它。
答案 0 :(得分:1)
您可以使用NSOperation和NSOperationQueue。 它与dispatchlib几乎相同,但是面向对象。 您可以将工作包装在NSOperation上,然后将其添加到NSOperationQueue。 然后您可以随时取消NSOperation。 可能必须阅读Apple文档以更好地解释这两个类。
答案 1 :(得分:1)
看看this tutorial。它显示了如何使用NSOperationQueue异步下载数据,并在用户滚动并且此单元格不再可见时取消此队列。