Предупреждение для пользователей iOS / iPhone о дублирующих наблюдениях Nsnotification
-
28-09-2019 - |
Вопрос
Это не вопрос так много как предупреждение для других, чтобы спасти их некоторое время.
NsnotificationCenter на IOS 3 / iPhone OS 3 (я предполагаю, что Mac OS X и iOS 4) имеет следующее поведение:
Если вы зарегистрируете себя несколько раз для точного конкретного уведомления, NsnotificationCenter будет НЕТ Распознайте резервирование и вместо этого устрелятся как можно больше уведомлений, на которые вы зарегистрировали наблюдение.
Это почти никогда не хочет поведение, которое вы хотите увидеть, и почти всегда случайно.
Пример:
Я хочу контроллер своего представления получать уведомления от объекта Singleton Network, когда новые данные поставляются:
- (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, я получу дубликаты уведомлений к контроллеру моего представления.
В многопоточной среде это мир болящей. Поверьте мне.
Просто вкладывая это в случае, если есть другие, которые бегают в чем-то подобное.
Решение
NsnotificationCenter на IOS 3 / iPhone OS 3 (я предполагаю, что Mac OS X и iOS 4) имеет следующее поведение:
Если вы зарегистрируете себя несколько раз для точного конкретного уведомления, NsnotificationCenter будет НЕТ Распознайте резервирование и вместо этого устрелятся как можно больше уведомлений, на которые вы зарегистрировали наблюдение.
Это почти никогда не хочет поведение, которое вы хотите увидеть, и почти всегда случайно.
Пример:
Я хочу контроллер своего представления получать уведомления от объекта Singleton Network, когда новые данные поставляются:
- (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, я получу дубликаты уведомлений к контроллеру моего представления.
В многопоточной среде это мир болящей. Поверьте мне.
Просто вкладывая это в случае, если есть другие, которые бегают в чем-то подобное.
Другие советы
Вы должны и всегда очистите своих наблюдателей.
Самый простой способ сделать это: [[NsnotificationCenter DefaultCenter] RemoveObserver: Self
ViewDidload не является хорошим местом для добавления наблюдателей, потому что эта функция может вызвать несколько раз, это происходит при запуске ViewDidUnload. Хорошее место, чтобы поставить ваши Addobservers в ViewWillAppear и RemoveBservers в ViewWilldisAppear.
Как вы сами говорили, NsnotificationCenter не проверяет дубликаты, что может быть раздражает для некоторых, но имеет смысл при охвате полной системы за ним.
Та же логика применяется к добавлению целей на определенные объекты, но часто есть ключевое распознавание на тех.
Спасибо за понимание, и за хорошее, SEO-дружественное предупреждение :)