2014-01-27 48 views
0

我想在不阻塞UI線程(它是一個應用程序)中等待目標c中的異步線程。等待異步線程在目標c(簡單的例子裏面)

我有以下代碼:

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

在C#中我會使用異步和等待,我可以很容易地在目標C實現這一目標?

回答

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()將其返回到主線程。

+0

感謝您的回答,我已更新我的示例以包含主線程。更新你的用戶界面是什麼意思?我的用戶界面是似乎只是自動運行的iOS應用程序。 – Jamesla

+1

@Jamesla你需要通過這個文檔https://developer.apple.com/library/IOS/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102- SW1 – Tirth

0

是什麼讓你認爲你應該等待異步操作完成?這就是異步操作的重點,你不要等待它!

你調用了exportAsynchronouslyWithCompletionHandler並給它一個塊。我不知道這種方法,但我認爲它會異步執行,當它完成時,它會調用您提供的塊。只要方法設置了異步操作,對exportAsynchronouslyWithCompletionHandler的調用就會很快返回。

該塊在主線程上調度另一個調用「exportDidFinish:exporter」的塊,然後返回(無需等待),然後完成exportAsynchronouslyWithCompletionHandler中的所有異步代碼。

現在我們只有一個塊被分派到主隊列中。只要運行循環空閒,該塊就在主線程上執行。您添加的註釋行「//在此等待」毫無意義。 exportDidFinish:在調用時候,主線程會調用exporter,然後我們就完成了。