4

我試圖根據需要異步處理方法,一旦第一個方法完成,只有第二個方法應該開始執行。問題是第一種方法本身具有在後臺線程上運行的代碼。多線程:只有在完成執行其他方法後才執行方法調用

我試過dispatch_semaphore_wait,但那也沒用。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 

     dispatch_group_t group = dispatch_group_create(); 


     dispatch_group_async(group, queue, ^{ 

      [self firstMethod]; 
      NSLog(@"firstMethod Done"); 

     }); 
     dispatch_group_notify(group, queue,^{ 

      NSLog(@"1st method completed"); 
      NSLog(@"2nd method starting"); 

      [self secondMethod]; 

     }); 

FirstMethod本身運行在另一個工作線程這樣

-(void)firstMethod 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    //processing here.....  

}]; 

什麼是實現這一目標的最好方式,我不能改變firstMethod的定義,因爲它通過一些第三方提供,也改變它意味着改變很多從那裏這種方法被調用現有的代碼

+3

目前基本上沒有辦法做到你的要求,除非第三方庫提供了一些方法來檢測當私人塊完成執行時。可以? – 2013-05-09 23:01:17

+0

rob:不,它不能提供任何方法來查找私有塊的完成時間 – iHS 2013-05-09 23:18:05

+0

您可以總結私有異步塊的功能嗎?特別注意任何文件系統/網絡交互。 – 2013-05-24 20:03:42

回答

-1

派遣一個隊列,並打電話給你的方法,以便

dispatch_group_async(group, queue, ^{ 

      [self firstMethod]; 
      NSLog(@"firstMethod Done"); 
      [self secondmethod]; 

     }); 

或者您可能派遣一組3個併發隊列(這是一個猜測)

+1

這不會作爲firstMethod在其定義中擁有自己的dispatch_async調用,並且[self secondmethod];不會等待[self firstMethod];完成 – iHS 2013-05-09 22:22:08

12

您可以使用完成塊。你只需要修改firstMethod這樣:

- (void)firstMethodWithOnComplete:(void (^)(void))onComplete { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
      //processing here..... 
      onComplete(); 
     }); 
}  

,然後用它是這樣的:

[self firstMethodWithOnComplete:^{ 
    [self secondMethod]; 
}]; 
+0

似乎很好的替代方案,但第一種方法是在不同的庫中,修改它需要改變很多類。還有其他解決方案嗎? – iHS 2013-05-09 22:33:19

+0

將增加一個屬性到實現firstMethod的類更容易嗎?在這種情況下,您可以使用委託模式。如果需要,我可以詳細說明。 – robbartoszewski 2013-05-09 22:56:22

相關問題