1

我正在尝试调用一种方法,在该方法中我使用dispatch_async.

它应该很简单,但由于某些原因,UI 仍然被阻塞,直到方法返回。

这是我所拥有的:

dispatch_queue_t privateQueue = dispatch_queue_create("com", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(privateQueue, ^
{                  
    __block UIImageView *imgView = [[UIImageView alloc] initWithFrame:self.view.frame];
    dispatch_async(dispatch_get_main_queue(), ^
    {
        imgView = [controllerB startProcess];
        controllerC.imageView = imgView;
    });
});

startProcess在 UI 再次免费之前,我仍然需要等待退货。

然后我试图imgView = [controllerB startProcess];移出dispatch_get_main_queue()

dispatch_async(privateQueue, ^
{                  
    __block UIImageView *imgView = [[UIImageView alloc] initWithFrame:self.view.frame];
    imgView = [controllerB startProcess];
    dispatch_async(dispatch_get_main_queue(), ^
    {
        controllerC.imageView = imgView;
    });
}); 

在这种情况下,UI 永远不会更新,imgView但 UI 不会锁定。

我曾尝试使用全局队列,但结果是一样的(UI 必须等待):

dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

我想我在这里遗漏了一些非常明显的东西。要么就是这样,要么对我来说这是漫长的一天。

编辑:

[controllerB startProcess];

我正在使用:

UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

我不确定这些方法是否与导致我的问题的 GCD 有关。图像只是.png。

一直在苦苦思索这件事。我的想法不多了。我可以使用图像更新 UI 的唯一方法是将方法调用放在 中dispatch_get_main_queue(),这超出了使用 GCD 的目的,因为在图像准备好并且方法返回之前,所有 UI 都会被阻塞。

任何建议将不胜感激。

4

2 回答 2

1

是否有可能-在您的第二个示例中-当您尝试在主队列上设置 imageView 时,后台 imageView 的异步计算尚未完成,因此无法显示 imageView?在这种情况下,调度组可能会有所帮助:

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("com.name.queue”, DISPATCH_QUEUE_CONCURRENT);

dispatch_group_async(group, queue, ^{
    //Do work
    imgView = [controllerB startProcess];
});

dispatch_group_notify(group,queue,^{
    //This code runs as soon as the code in the dispatch group is done.
    controllerC.imageView = imgView;
});
于 2014-02-25T19:37:01.273 回答
1

使用第二种方法。修改 startProcess 以使用完成块并在完成块内更新您的 imageView。这可确保在 startProcess 完成后更新 imageView。

于 2014-02-25T19:40:32.480 回答