我正在使用异步任务在我的主视图控制器上从Web获取图像。当用户点击我的表视图上的任何单元格时,我想暂停异步任务并转到另一个视图。我该怎么做?当用户返回主视图时,我还需要继续执行任务。我的代码
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *imagefromWeb = [UIImage imageWithData:[NSData dataWithContentsOfURL:[IconArray objectAtIndex:indexPath.row]]];
CGSize newSize= CGSizeMake(45.0,45.0);
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[imagefromWeb drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image=newImage;
[cell setNeedsLayout];
MAKE_IMAGE_CURVED(cell.imageView)
});
});
答案 0 :(得分:2)
有两种合理的方法。一种是在需要暂停时设置一个标志。后台队列中的块应在执行前检查此标志,如果已设置,则等待取消设置。该标志最好构造为信号量。
但是,GCD确实支持队列暂停。如果将后台请求放在自定义队列上(使用dispatch_queue_create
创建一个),则可以在队列上使用dispatch_suspend
以防止执行更多块。一旦你准备好再去,请致电dispatch_resume
。这将不阻止当前正在执行的块完成 - 只是未来的块。没有明智的方法可以让我想到停止执行已经处于中间流程的块。
对于涵盖信号量和队列管理的GCD文档,see here。