Запрос NSNotification Вызовы контроллера рекурсивного представления и регистрация для получения одного и того же уведомления несколько раз

У меня вопрос относительно NSNotificationCenter. У меня есть 3 контроллера представления, которые регистрируются для одного и того же push-уведомления, и поток приложения выглядит следующим образом:

ДЕЛО 1:

  1. Просмотр регистра контроллера 1 для уведомления
  2. Контроллер представления 2 инициализируется и отображается как модальный из контроллера представления 1.
  3. Просмотрите регистрацию контроллера 2 для получения уведомлений
  4. Контроллер представления 3 инициализируется и отображается как модальный из контроллера представления 2.
  5. Просмотрите регистрацию контроллера 3 для получения уведомлений
  6. Уведомление запущено

Все ли мои контроллеры представлений (VC1, VC2 и VC3) будут реагировать на это уведомление? Я хочу, чтобы на это уведомление отвечал только мой самый верхний контроллер представления. Будет отдельная активация уведомления в случае других VC в иерархии представлений.

СЛУЧАЙ 2:

  1. Просмотр регистра контроллера 1 для уведомления
  2. Контроллер представления 1 получает автовызов и отображается как модальный на предыдущем контроллере представления.
  3. View Controller 1 снова зарегистрируйтесь для получения уведомлений
  4. Шаги 2 и 3 повторяются еще раз.
  5. Уведомление запущено

Вот я хочу, чтобы мой самый топовый ВК отреагировал на это уведомление. Будет отдельная активация уведомления в случае других VC в иерархии представлений. 6. Уведомление запущено


person Abhinav    schedule 20.04.2011    source источник


Ответы (2)


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

Одним из решений является прекращение прослушивания, например, при исчезновении контроллера представления, но вы должны быть осторожны, чтобы начать прослушивание/прекратить прослушивание в соответствующей паре методов, поэтому не прослушивайте init и прекратите слушать в представленииWillDisappear, если вы ожидаете, что оно снова будет слушать, когда пользователь вернется назад.

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

Наконец, не регистрируйтесь дважды в одном и том же контроллере представления — вы получите уведомление дважды, если сделаете это.

Если вы думаете об этом таким образом, я уверен, что вы скоро найдете подходящее решение для вашего случая.

person Roger    schedule 20.04.2011
comment
Привет Роджер. Твое право. Не могли бы вы увидеть мою идею ниже, если вы согласны с этим. - person Abhinav; 21.04.2011

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

person Abhinav    schedule 21.04.2011
comment
Конечно, это еще один способ сделать это. - person Roger; 21.04.2011