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];
Author: Greg, 2011-11-07

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ń :

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ę.

To nieuchronnie spowoduje bóle głowy.

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.
 20
Author: PixelCloudSt,
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ół).

 8
Author: XJones,
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