Czy Można używać powiadomienia do komunikacji z powrotem do głównego wątku aplikacji na IOS? (cf performSelectorOnMainThread)
Czy Można używać powiadomienia do komunikacji z powrotem do głównego wątku aplikacji na IOS? / align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center / Czyli są jakieś gotta do tego celu?
Tło
- chcesz wywołać z powrotem główny wątek interfejsu użytkownika z wątku tła (np. performSelectorInBackground)
- czy można użyć performSelectorOnMainThread, aby komunikować się z powrotem, ale zastanawiasz się, czy korzystanie z powiadomienia jest w porządku?
Na przykład
[[NSNotificationCenter defaultCenter] postNotificationName:@"ModelChanged" object:self];
2 answers
Właściwie jest gottcha; będziesz crash losowo! To było moje doświadczenie. Ma to związek z tym, że obiekt otrzymujący powiadomienie robi to w tym samym wątku, co nadawca powiadomienia.
Z dokumentacji Apple iOS na temat centrów powiadomień :
To nieuchronnie spowoduje bóle głowy.W aplikacji wielowątkowej powiadomienia są zawsze dostarczane w wątku, w którym zamieszczono zgłoszenie, które może nie być ten sam wątek, w którym obserwator zarejestrował się.
Jeśli powiadomienie jest odbierane przez coś w głównym wątku, odkryłem, że wchodzenie do głównego wątku z wątku w tle, aby wydać powiadomienie, jest najbezpieczniejszym sposobem, aby to zrobić. Jest to dość proste do zrobienia:
//Call this to post a notification and are on a background thread
- (void) postmyNotification{
[self performSelectorOnMainThread:@selector(helperMethod:) withObject:Nil waitUntilDone:NO];
}
//Do not call this directly if you are running on a background thread.
- (void) helperMethod{
[[NSNotificationCenter defaultCenter] postNotificationName:@"SOMENAME" object:self];
}
Niestety wprowadza to subtelne połączenie między nadawcą a odbiorcą, ponieważ modyfikujesz nadawcę, aby dostosować go do odbiorcy.
An jeszcze lepszym rozwiązaniem, jak zaznacza XJones, jest wysłanie przez nadawcę powiadomienia w dowolnym wątku, który zdecyduje się na, a następnie uczynienie słuchacza odpowiedzialnym za użycie odpowiedniego wątku do wykonania dowolnej akcji, której potrzebuje.
Mam nadzieję, że to było pomocne.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-30 16:41:27
Tak, powiadomienia mogą być używane w tym celu. możesz użyć dowolnej metody (protokoły, powiadomienia, wiadomości bezpośrednie) do komunikacji między obiektami w różnych wątkach. To, który z nich wybierzesz, zależy od tego, co uważasz za najbardziej odpowiednie. Powiadomienia są świetne, gdy obiekt publikujący powiadomienie nie wie nic o obiektach obserwujących powiadomienie. Jeżeli wyślesz wiadomość (np. performSelectorOnMainThread
) to obiekt wysyłający wiadomość musi wiedzieć o obiekcie, którym jest wysyłanie wiadomości do (zazwyczaj poprzez protokół).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-07 05:19:27