【问题标题】:How to suspend async task in iPhone?如何在 iPhone 中暂停异步任务?
【发布时间】:2012-12-31 11:33:20
【问题描述】:

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



        });

【问题讨论】:

    标签: iphone ios multithreading asynchronous dispatch


    【解决方案1】:

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

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

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

    【讨论】:

    • 尝试了 Flag 和 dispatch_suspend。没有变化。转到下一个视图仍然需要很长时间。
    • 你是如何尝试的?您不能在标准队列上使用暂停(当然可以,但这是个坏主意)。
    • 我用过这段代码。 threadQueue=dispatch_queue_create("ImageFetchQue",0);dispatch_async(threadQueue, ^{ });` 在另一个块中(在主队列上)dispatch_suspend(threadQueue);
    • 然后后台队列中的块将暂停(一旦当前执行的块完成)。这不太可能是阻碍视图转换的原因。
    • “一旦当前执行的块完成”意味着从网络获取所有图像。对吗?
    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    相关资源
    最近更新 更多