如何暂停iPhone中的异步任务?

时间:2012-12-31 11:33:21

标签: iphone ios multithreading asynchronous dispatch

我正在使用异步任务在我的主视图控制器上从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)
            });



        });

1 个答案:

答案 0 :(得分:2)

有两种合理的方法。一种是在需要暂停时设置一个标志。后台队列中的块应在执行前检查此标志,如果已设置,则等待取消设置。该标志最好构造为信号量。

但是,GCD确实支持队列暂停。如果将后台请求放在自定义队列上(使用dispatch_queue_create创建一个),则可以在队列上使用dispatch_suspend以防止执行更多块。一旦你准备好再去,请致电dispatch_resume。这将阻止当前正在执行的块完成 - 只是未来的块。没有明智的方法可以让我想到停止执行已经处于中间流程的块。

对于涵盖信号量和队列管理的GCD文档,see here