0

我想依次執行2個塊,其中每個塊都是異步執行的。GCD - 如何在主線程上等待主隊列上執行的異步回調

例如

[someMethodWithCompletionHandler:^() { 
    // do something in the completion handler 
}]; 

[anotherMethodWithCompletionHandler:^ { 
    // do something else in the completion handler after the first method completes 
}]; 

現在,我需要「anotherMethodWithCompletionHandler」之後「someMethodWithCompletionHandler」的情況發生完成(包括其完成處理)

經常我會創造一個dispatch_group並等待在2種方法(我不能在另一個完成處理程序中嵌套2個方法,因爲它需要很多代碼才能移動)

但問題是第一個完成處理程序塊i s在主線程中調用(通過方法本身調用主線程中的塊),所以我無法有效地創建阻塞主線程的dispatch_group

所以線程的狀態看起來像這樣

// main thread here 

[self doFirstPortionOfWork]; 

// main thread here 
[self doSecondPortionOfWork]; 


-(void)doFirstPortionOfWork 
{ 
.. a lot of stuff happening 
    [someMethodWithCompletionHandler:^{ 
    // this is the main thread 
    }]; 
// would like to block the return here until the completion handler finishes 
} 

-(void)doSecondPortionOfWork 
{ 
... a lot of work here 
    [anotherMethodWithCompletionHandler^{ 
    // this is also called into the main thread 
    }]; 
// would like to block the return here until the completion handler finishes 
} 

所以,我怎麼能這樣跟了訴諸了很多嵌套的方法和能夠阻止主線程,直到所有的完成?

回答

1

主線是一樣的主隊列

這是不可能的主線程等待在主線程今後的工作。你正在阻止未來的工作。

你可以這樣說:

[someMethodWithCompletionHandler:^() { 
    // do something in the completion handler 
    [anotherMethodWithCompletionHandler:^ { 
     // do something else in the completion handler after the first method completes 
    }]; 
}]; 
+0

我不能這樣做,因爲我沒有嵌套 –

+0

我不明白你的意思是「_I沒有nesting_什麼」。 – Tricertops