Czy dispatch_async (dispatch_get_main_queue (), ^ {…}); poczekaj, aż skończysz?
W mojej aplikacji mam scenariusz, w którym chcę wykonać czasochłonne zadanie, które polega na przetwarzaniu danych oraz aktualizacji interfejsu użytkownika w metodzie. Moja metoda wygląda tak,
- (void)doCalculationsAndUpdateUIs {
// DATA PROCESSING 1
// UI UPDATE 1
// DATA PROCESSING 2
// UI UPDATE 2
// DATA PROCESSING 3
// UI UPDATE 3
}
Ponieważ jest to czasochłonne, chciałem wykonać przetwarzanie danych w wątku w tle, używając,
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
Ale ponieważ zarówno przetwarzanie danych, jak i aktualizacje interfejsu użytkownika są w tej samej metodzie, chciałem przenieść tylko aktualizacje interfejsu użytkownika w głównym wątku, używając,
dispatch_async(dispatch_get_main_queue(), ^{
Wreszcie moja metoda wygląda tak,
- (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
});
}
Czy to naprawdę działa? Czy to naprawdę dobra praktyka? Jaki jest najlepszy sposób osiągnięcia tego celu?
P.S. Wszystkie te trzy operacje są ze sobą powiązane.
EDYTOWAĆ: Przepraszam chłopaki. mambrakowało linii w powyższym kodzie. Mój aktualny kod wygląda tak.
- (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
});
});
}
Jeszcze raz bardzo przepraszam za zamieszanie.