我有兩個API調用如下:dispatch_async理解執行順序
-(void) doTask1{
dispatch_async(queueSerial, ^{ //B1
[fileObj setFileInfo:file];
});
}
-(void) doTask2{
dispatch_async(queueSerial, ^{ //B2
[fileObj getFileInfo:fileName completion:^(NSError *error) {
dispatch_async(queueSerial2, ^{
//completion work C1
});
}]
});
}
現在,我的問題是,從我已經明白通過閱讀GCD,如果一個進程doTask1
和電話doTask2
後立即調用,這將導致他們兩人在排隊,並且前進B1
B2
。
然而,不被保證B1
是B2
開始執行之前完全執行?因爲由B1
更新的文件由B2
使用。
如果B2
開始執行之前B1
完全結束,它可能會導致一些問題。
或者是更好地做到
-(void) doTask1{
dispatch_sync(queueSerial, ^{B1});
}
-(void) doTask2{
dispatch_sync(queueSerial, ^{B2});
}
感謝您的評論。我編輯了我的問題來添加更多關於代碼的細節。我不明白的是,你對於「關於那些關係沒有保證」的評論是什麼意思? – ExceptionHandler
我的意思是說,在異步的情況下,無論代碼調用doTask1(),doTask2()在調度工作完成之前可能已經做了各種其他操作。在同步的情況下,調用者也會暫停,直到串行隊列操作完成。 –
我明白了。我理解這部分。如果B2正在將其完成處理程序分派到不同的隊列中,是否可以在B1完成之前執行完成塊?有沒有辦法確保這不會發生,並且B2中的完成塊等到B1完成? – ExceptionHandler