我正在尝试调用一种方法,在该方法中我使用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 都会被阻塞。
任何建议将不胜感激。