2010-06-18 1 views
22

Это не вопрос, а предупреждение другим, чтобы они могли их сэкономить.Предупреждение для пользователей iOS/iPhone о двойных наблюдениях NSNotification

NSNotificationCenter на прошивке 3/iPhone OS 3 (я предполагаю, что также Mac OS X и IOS 4) имеет следующее поведение:

Если вы регистрируете себе несколько раз для точного специального уведомления, NSNotificationCenter будет НЕ распознают избыточность и вместо этого будут сбрасывать столько уведомлений, сколько вы зарегистрировали для наблюдения.

Это почти никогда не поведение, которое вы хотите увидеть и почти всегда случайное.

Пример:

Я хочу, чтобы мой вид контроллера для получения уведомлений от объекта синглтона сети, когда новые данные поступают в:

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(newDataArrived:) 
       name:NewDataArrivedNotification 
       object:[NetworkListener sharedNetworkListener]]; 
} 

но раньше я уже поставил то же самое в viewWillAppear:

- (void) viewWillAppear 
{ 
    [super viewWillAppear]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(newDataArrived:) 
       name:NewDataArrivedNotification 
       object:[NetworkListener sharedNetworkListener]]; 
} 

Обратите внимание, что это точно то же самое уведомление, решение, к тому же имя наблюдателя, отправителя и уведомления.

В этом случае, если я не удалю один из этих вызовов addObserver, я получу дубликаты уведомлений на свой контроллер представления.

В многопоточной среде это мир боли. Доверьтесь мне.

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

+1

Хорошо иметь предупреждение - вы должны, вероятно, поместить большую часть этого в ответ и принять его :) (реферат Алекс Требек бормочет что-то о том, что «должен рассказать вам свой ответ ...») –

+0

Принял меня достаточно долго, но сделал. –

ответ

4

NSNotificationCenter на прошивке 3/iPhone OS 3 (я предполагаю, что также Mac OS X и IOS 4) имеет следующее поведение:

Если вы регистрируете себе несколько раз для точного специального уведомления, NSNotificationCenter будет НЕ распознают избыточность и вместо этого будут сбрасывать столько уведомлений, сколько вы зарегистрировали для наблюдения.

Это почти никогда не поведение, которое вы хотите увидеть и почти всегда случайное.

Пример:

Я хочу, чтобы мой вид контроллера для получения уведомлений от объекта синглтона сети, когда новые данные поступают в:

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(newDataArrived:) 
       name:NewDataArrivedNotification 
       object:[NetworkListener sharedNetworkListener]]; 
} 

но раньше я уже поставил то же самое в viewWillAppear:

- (void) viewWillAppear 
{ 
    [super viewWillAppear]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(newDataArrived:) 
       name:NewDataArrivedNotification 
       object:[NetworkListener sharedNetworkListener]]; 
} 

Обратите внимание, что это точно то же самое уведомление, решение, к тому же имя наблюдателя, отправителя и уведомления.

В этом случае, если я не удалю один из этих вызовов addObserver, я получу дубликаты уведомлений на свой контроллер представления.

В многопоточной среде это мир боли. Доверьтесь мне.

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

+0

Это ошибка кодера, а не ошибка библиотеки. Зарегистрируйте только уведомления, которые хотите получить. Я не уверен, почему вы будете регистрироваться в одном и том же объекте несколько раз за одно и то же уведомление. – chadbag

+0

Это была моя точка. –

+0

в ситуациях, когда у вас есть контроллер базового представления, который имеет наблюдателя и некоторые другие контроллеры представлений, расширяет этот базовый класс, тогда, если код для добавления наблюдателя находится в методах жизненного цикла вида, таких как viewDidLoad или viewDidAppear, способ избежать наблюдения добавлено в Диспетчерскую таблицу, удалив наблюдателя, а затем добавив его в поле зрения, загрузилось. Таким образом, наблюдатель не будет добавляться несколько раз. –

0

Как вы сами сказали, NSNotificationCenter не проверяет дубликаты, что может быть раздражающим для некоторых, но имеет смысл при анализе всей системы за ней.

Та же логика относится к добавлению целей к определенным объектам, но на них часто присутствует распознавание ключей.

Благодарим Вас за понимание и за хорошее, SEO-дружественные предупреждения :)

+0

Рассмотрите всю систему за ней, это имеет смысл? Не могли бы вы рассказать подробнее? Благодарю. –

2

Вы должны всегда и очистить ваши наблюдатели.
Самый простой способ сделать это: [[NSNotificationCenter defaultCenter] removeObserver: self]
viewDidLoad не является хорошим местом для добавления наблюдателей, потому что эти функции могут вызываться несколько раз, это происходит при запуске viewDidUnload. Хорошее место, чтобы поместить ваш addObservers в viewWillAppear и removeObservers в viewWillDisappear.

+0

также, viewDidUnload устарел и больше не вызывается в iOS 6 –

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

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