2013-04-30 2 views
30

Если класс регистрирует события NSNotificationCenter определенного типа, а другой класс отправляет событие такого типа, будет ли код в приемнике выполняться раньше (синхронно) или после (асинхронно) класс проводки продолжается?Получают ли события NSNotificationCenter синхронно или асинхронно?

- (void)poster { 
    [[NSNotificationCenter defaultCenter] 
     postNotificationWithName:@"myevent" 
     object:nil]; 
    NSLog(@"Hello from poster"); 
} 

- (void)receiver { 
    [[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector:(mySelector) 
     name:@"myevent" 
     object:nil]; 
} 

- (void) mySelector:(NSNotification *) notification { 
    NSLog(@"Hello from receiver"); 
} 

В приведенном выше примере кода будет напечатан «Hello from receiver» до или после «Hello from caller»?

+0

просто посмотрите http://stackoverflow.com/questions/1900352/what-is-nsnotification –

+0

прочитайте исходное сообщение ниже ответа ..http: //stackoverflow.com/questions/7880742/ios-are- методы-by-by-delegates-and-observers-execute-on-the-the-main-thread – BhushanVU

ответ

65

Как указано в документации для NSNotificationCenter NSNotificationCenter Class Reference уведомления отправляются синхронно.

Центр уведомлений синхронно уведомляет обозревателей. Другими словами, методы postNotification: не возвращаются до тех пор, пока все наблюдатели не получат и не обработают уведомление. Для отправки уведомлений асинхронно используйте NSNotificationQueue.

В многопоточном приложении уведомления всегда отправляются в поток, в котором было отправлено уведомление, которое может быть не тем же самым потоком, в котором наблюдатель зарегистрировал себя.

Надеюсь, это поможет вам.

+3

Короткий и подходящий ответ !! –

+0

Я не понимаю «синхронный» термин, или ваш ответ абсолютно неверен. Я хотел позвонить в следующем порядке: 1) уведомление; 2) обработчик уведомлений; 3) код в том же блоке в уведомлении. Но это называется 1, 3, 2 - неправильный порядок – Gargo

+0

@Gargo, если вы не понимаете ответ, который не означает, что ответ неверен. Это правильный и принятый ответ. –

Смежные вопросы