Подтвердить что ты не робот

Когда создавать пользовательский NSNotificationCenter?

Я играл с NSNotificationCenter, и мне было интересно, когда вы будете использовать свой собственный центр уведомлений, а не defaultCenter? И каковы будут преимущества этого?

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

4b9b3361

Ответ 1

Документация Apple неясна, и в ней просто говорится, что обычно программисту не нужно было бы создавать новую:

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

Полный источник: Документация NSNotificationCenter.

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

[center addObserver: self selector: @selector(observe:) name: @"observe" object: someObject];

И когда вы отправляете уведомление, вы можете указать объект:

[center postNotificationName: @"observe" object: someObject];

Таким образом, вы используете N имен и объектов M, вы можете обрабатывать отмеченные уведомления N * M. Я думаю, что нет необходимости использовать два центра уведомлений. Теоретически, если вы закончили все имена, вы можете создать еще один, используя alloc + init, но я почти не вижу, как это действительно может оказаться полезным.

Кроме того, считают, что центр уведомлений часто используется, когда есть два объекта, которые не принадлежат прямой указатель друг к другу (в противном случае, почему бы не просто вызов метода на нем?), Из-за которых следует избегать сложных привязок (особенно, когда вы используете много xib файлов), поэтому наличие уникального объекта центра уведомлений очень удобно.

Если вместо этого вы используете центр уведомлений, полученный с помощью allot + init, тогда вы должны убедиться, что все коммуникационные объекты имеют указатель на этот центр уведомлений, и это добавит некоторую сложность. Вся мощность центра уведомлений будет потрачена впустую.

Ответ 2

Хотя он широко использовался в AppKit через аксессуар defaultCenter singleton, в основе его, NSNotificationCenter - это просто "общий механизм развязки". Предоставление вам alloc/init ваших собственных экземпляров - это просто выражение этой универсальности. Если вы хотите использовать его для чего-то еще, вы могли бы.

Чтобы проиллюстрировать несколько абсурдным примером, подумайте об этом так: NSDocument имеет аксессуар windowControllers, который возвращает конкретный, благословенный, важный экземпляр NSArray, который содержит ссылки на все контроллеры окон, специфичные для этого документа. Тем не менее, NSArray - всего лишь "общая структура данных списка". Просто потому, что существует этот специальный экземпляр с указанной целью, не означает, что не может быть полезно повторно использовать NSArray для ваших собственных целей. Оба NSArray и NSNotificationCenter предоставляют общие структуры данных/строительные блоки, конкретные экземпляры которых используются в благословенных "занятиях" вокруг AppKit, но оба они могут быть полезны сами по себе.

Основной случай использования, который я видел для создания автономных экземпляров NSNotificationCenter, заключается в том, что вы хотите запускать несколько экземпляров некоторой сложной подсистемы на нескольких потоках параллельно и не иметь их потенциально путаться с помощью сквозных уведомлений. В этом случае общий шаблон состоит в том, чтобы выделить один NSNotificationCenter для каждого потока. Это разделяет уведомления для каждой сети объектов на один поток. Это обычно требуется, если наблюдатели проходят nil для параметра объекта, намереваясь прослушивать все уведомления с заданным именем независимо от источника.

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