0

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



        });
4

1 回答 1

2

对此有两种合理的方法。一种是在您希望暂停时设置一个标志。后台队列上的块在执行前应该检查这个标志,如果设置了,等待它被取消设置。最好将标志构造为信号量。

但是,GCD 确实支持队列挂起。如果您将后台请求放在自定义队列上(用于dispatch_queue_create制作一个),则可以dispatch_suspend在队列上使用以防止执行进一步的块。dispatch_resume一旦你准备好再去打电话。这不会阻止当前执行的块完成 - 只是未来的块。我想不出任何明智的方法来停止执行已经在流程中的块。

有关涵盖信号量和队列管理的 GCD 文档,请参见此处

于 2012-12-31T11:58:28.867 回答