等待目标c中的异步线程(内部简单示例)

时间:2014-01-27 04:24:31

标签: objective-c multithreading grand-central-dispatch

我试图在目标c中等待异步线程而不阻塞UI线程(它是一个应用程序)。

我有以下代码:

-(void)MainUIThread
{
    [exporter exportAsynchronouslyWithCompletionHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [self exportDidFinish:exporter];
            //wait here without blocking
        });
    }];
}

在c#中我会使用async和await,我可以在Objective c中轻松实现吗?

2 个答案:

答案 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,然后我们就完成了。