2013-10-07 1 views
0

Скажем, у меня есть эта проводка от одного класса, который стреляет быстро:Время жизни объекта NSNotification

[[NSNotificationCenter defaultCenter] postNotificationName:kGotData object:nil userInfo:someDictionaryObject]; 

И наблюдатель из другого класса:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gotData:) name:kGotData object:nil]; 

-(void)gotData:(NSNotification *)notification 
{ 
    NSDictionary *myUserInfo = notification.userInfo; 

    // more code to process userInfo, etc. 
} 

Что делать, если gotData займет больше времени, чтобы обработать myUserInfo, чем он получал звонки из центра уведомлений?

ответ

3

Это не может занять больше времени - звонки полностью синхронны. Центр уведомлений выступает в качестве центра обмена сообщениями «один ко многим», который отделяет участников, которые могут захотеть слушать от актеров, которые могут захотеть объявить о событии.

Предположим, что у вас был только один наблюдатель, тогда ваш код эквивалентен прямому звонку gotData: напрямую. Таким образом, никакое дальнейшее уведомление не может произойти до тех пор, пока предыдущий не будет обработан.

+0

Что делать, если у меня есть два наблюдателя, можно работать быстрее, чем другие? – user523234

+0

@ user523234, тогда это точно то же самое, что и объект, отправляющий уведомление по очереди. Таким образом, это будет общее время обоих бит обработки перед вызовом 'postNotificationName:'. – Tommy

4

Все отправленные уведомления отправляются наблюдателям и обрабатываются в одной и той же ветке и немедленно. Итак, если gotData: требует времени и не подталкивает его обработку к другому потоку, он просто блокирует все, что собирается опубликовать следующее уведомление. Поэтому следующее уведомление будет опубликовано позже в срок (чем вы могли бы ожидать).

+0

Ответы на ваши вопросы и ответы Томми подтвердили мое заблуждение NSNotification. Спасибо. – user523234

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

  • Нет связанных вопросов^_^