我在我的應用程序中有一個場景,我想在一個方法中執行一些耗時的任務,包括一些數據處理以及UI更新。我的方法是這樣的,dispatch_async(dispatch_get_main_queue(),^ {...});等到完成了?
- (void)doCalculationsAndUpdateUIs {
// DATA PROCESSING 1
// UI UPDATE 1
// DATA PROCESSING 2
// UI UPDATE 2
// DATA PROCESSING 3
// UI UPDATE 3
}
由於它是費時,我想這樣做在後臺線程的數據處理,使用,
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
但作爲兩個數據處理和UI更新是在同樣的方法,我想用移動僅在主線程的UI更新,
dispatch_async(dispatch_get_main_queue(), ^{
最後我的方法是這樣的,
- (void)doCalculationsAndUpdateUIs {
// DATA PROCESSING 1
dispatch_async(dispatch_get_main_queue(), ^{
// UI UPDATE 1
});
/* I expect the control to come here after UI UPDATE 1 */
// DATA PROCESSING 2
dispatch_async(dispatch_get_main_queue(), ^{
// UI UPDATE 2
});
/* I expect the control to come here after UI UPDATE 2 */
// DATA PROCESSING 3
dispatch_async(dispatch_get_main_queue(), ^{
// UI UPDATE 3
});
}
這是否真的有用?這真的是一個好習慣嗎?達到此目的的最佳方法是什麼?
P.S.所有這三項行動都是相互關聯的。
編輯:對不起球員。我有在上面的代碼中錯過了一行。我的實際代碼看起來像這樣。
- (void)doCalculationsAndUpdateUIs {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// DATA PROCESSING 1
dispatch_async(dispatch_get_main_queue(), ^{
// UI UPDATE 1
});
/* I expect the control to come here after UI UPDATE 1 */
// DATA PROCESSING 2
dispatch_async(dispatch_get_main_queue(), ^{
// UI UPDATE 2
});
/* I expect the control to come here after UI UPDATE 2 */
// DATA PROCESSING 3
dispatch_async(dispatch_get_main_queue(), ^{
// UI UPDATE 3
});
});
}
再一次,我真的爲混亂道歉。
也許'dispatch_sync'可幫助這裏... –
@DaveDeLong也許。我已經看到開發人員使用'dispatch_sync',因爲它看起來合乎邏輯,但實際上往往不需要。 EmptyStack沒有分享他想等的原因,所以我們不可能告知這是不是一個好主意。 – Rob
@Rob yep,'dispatch_sync'可能非常危險,因爲這樣更容易死鎖。但有時*這是正確的做法。 :) –