Предупреждение для пользователей iOS / iPhone о дублирующих наблюдениях Nsnotification

StackOverflow https://stackoverflow.com/questions/3072811

Вопрос

Это не вопрос так много как предупреждение для других, чтобы спасти их некоторое время.

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-дружественное предупреждение :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top