5

Natknąłem się na ten fragment kodu i nie mogę w pełni zrozumieć, dlaczego autor to zrobił. Spójrz na ten kod:Czy dispatch_async (dispatch_get_main_queue(), ...) jest w tym przypadku konieczne?

someMethodStandardMethodUsingABlock:^() { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil]; 
    }); 
}]; 

Mam metodę z blokiem zakończenia, aw tym bloku należy wysłać powiadomienie. Nie do końca rozumiem, dlaczego w tym przypadku konieczna jest kolejka główna. Blok zostanie już uruchomiony na głównym wątku, a nawet gdyby tak nie było, nie sądzę, że byłoby to naprawdę ważne? Po prostu napisałbym to:

someMethodStandardMethodUsingABlock:^() { 
    [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil]; 
}]; 

To działa w moich testach.

Jeśli możesz mi w tym pomóc, naprawdę to doceniam!

Matt

Odpowiedz

9

te 2 zdania z NSNotificationCenter Class Reference zaproponować kilka możliwych powodów:

się centrum powiadamiania dostarcza informację obserwatorów synchronicznie. Innymi słowy, metody postNotification: nie zwracają się, dopóki wszyscy obserwatorzy nie otrzymają i nie przetworzą powiadomienia.

...

W wielowątkowych aplikacji, powiadomienia są zawsze dostarczane w wątku, w którym zgłoszenie zostało wysłane, które nie mogą być samym wątku, w którym obserwator zarejestrował się.

Może więc (a) autor nie chce, aby kod blokował się, dopóki wszyscy obserwatorzy nie przetworzą powiadomienia, i/lub (b) chce upewnić się, że metody obserwatora działają na głównym wątku.

+0

Dziękuję David, b wydaje się pasować w moim przypadku. Dokumenty wydają się nie określać, ale czy ma znaczenie, czy powiadomienie jest wysyłane w innym wątku niż ten zarejestrowany obserwator? Rozumiem przez to, że obserwator wciąż osiągnął – MGA

+0

Tak, obserwator nadal otrzyma powiadomienie, nawet jeśli zostanie wysłane w innym wątku. –

0

Czasami trzeba uruchomić metody, które uruchamiają pewne wykonanie asynchronicznie i wrócić od razu. Na przykład. niektóre z metod "klucza" AppDelegate, takich jak applicationDidBecomeActive lub applicationDidEnterBackground, muszą zostać wykonane i szybko powrócić, aby system operacyjny nie zabił aplikacji.

Nie wiem, czy tak jest w przypadku Twojego pytania, ale jest to możliwe wyjaśnienie użycia dispatch_async.