我试图在目标c中等待异步线程而不阻塞UI线程(它是一个应用程序)。
我有以下代码:
-(void)MainUIThread
{
[exporter exportAsynchronouslyWithCompletionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self exportDidFinish:exporter];
//wait here without blocking
});
}];
}
在c#中我会使用async和await,我可以在Objective c中轻松实现吗?
答案 0 :(得分:0)
[exporter exportAsynchronouslyWithCompletionHandler:^{
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
[self exportDidFinish:exporter]; // Its non blocking process
dispatch_async(dispatch_get_main_queue(), ^(void){
//Update your UI.
});
}];
尝试上面的代码段。
您在主线程上调用[self exportDidFinish:exporter]方法来阻止您的UI。我想exportDidFinish方法只有一个业务逻辑,然后使用dispatch_get_global_queue
在后台线程中发布逻辑计算,然后使用dispatch_get_main_queue()
将其返回到主线程。
答案 1 :(得分:0)
是什么让你认为你应该等待异步操作完成?这是异步操作的重点,你不要等待它!
你调用了exportAsynchronouslyWithCompletionHandler并给它一个块。我不知道那个方法,但我认为它会以异步方式执行操作,当它完成时它会调用你给它的块。一旦方法设置了异步操作,对exportAsynchronouslyWithCompletionHandler的调用将非常快速地返回。
该块调度在主线程上调用“exportDidFinish:exporter”的另一个块,然后返回(没有理由等待),然后exportAsynchronouslyWithCompletionHandler中的所有异步代码都完成。
我们现在拥有的是一个调度到主队列的块。一旦运行循环空闲,该块就在主线程上执行。你添加的评论行“//在这里等待”是毫无意义的。 exportDidFinish:当调用时,将在主线程上调用exporter,然后我们就完成了。