Arhn - архитектура программирования

Добавление и удаление проблемы с наблюдателем

У меня есть контроллер представления "A", который зарегистрирован как наблюдатель, как это,

-(void)viewWillAppear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"localActionTaken" object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
}

Я также удаляю наблюдателя в методе Dealloc.

Из контроллера представления «A» пользователь переходит к контроллеру представления «B», где публикуется уведомление «localActionTaken».

Все работает нормально до этого

Теперь у меня есть другой контроллер представления «C», из которого пользователь выталкивается на просмотр контроллера «A» и от «A» до «B». Но проблема в этом «C» -> «A» -> «B», если уведомление срабатывает в «B», то наблюдатель «A» уведомляется дважды!

Пожалуйста, дайте мне знать, если я что-то здесь упустил.

Примечание. Я использую ECSlidingview, а «A» и «C» — это контроллеры вида сверху.

----------------- Обновлять -----------------

Мне пришлось переместить removeObserver в viewWillDisappear на основе проверки конкретных контроллеров представления в стеке.


  • Как вам позвонил count -(void)viewWillAppear:(BOOL)animated ? возможно, уведомление @localActionTaken отправлено дважды. 16.02.2015
  • @Spetruk: Нет, отправляется только один раз. 16.02.2015
  • Возможно ли, что A дважды регистрируется как наблюдатель, даже если я вызываю removeObserver перед addObserver? 16.02.2015
  • попробуйте: - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver: собственное имя: объект @localActionTaken: ноль]; } 16.02.2015
  • @Spetruk: после удаления его из поля зренияWillDisappear of A, как A мог слушать, когда B публикует уведомление 16.02.2015

Ответы:


1

Количество наблюдаемых уведомлений накапливается (увеличивается более чем в два раза) при навигации между A и B. ViewWillAppear будет продолжать вызываться при переходе от A ‹-> B, но Dealloc еще не будет вызываться. Так что, возможно, что-то не так с removeObserver в viewWillAppear, что приводит к добавлению нескольких наблюдателей на A, и это приведет к наблюдению за несколькими уведомлениями. Пример кода, который вы включили, похоже, работает для добавления и удаления, а также для отключения при возврате к C, но я не пробовал с «ECSlidingview».

16.02.2015

2

Вы забыли важную вещь: вам нужно быть symmetric в своем классе.

Если вы добавите уведомление в методе init, вы удалите уведомление в методе dealloc.

Если вы добавите уведомление в метод viewWillAppear, вы удалите уведомление в методе viewWillDisappear (как сказал @Spetruk в комментарии).

Итак, вы можете сделать:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
}

- (void)viewWillDisappear:(BOOL)animated 
{ 
   [super viewWillDisappear:animated]; 

   [[NSNotificationCenter defaultCenter] removeObserver:self name:@"localActionTaken" object:nil]; 
}
16.02.2015
  • Если я удалю наблюдателя из viewWillDisappear of A, то я не смогу опубликовать уведомление в B, когда я перейду из A->B 16.02.2015
  • Если вы хотите передать данные или выполнить действие от B к A, вы должны использовать протокол и делегировать вместо уведомлений. 16.02.2015
  • Я бы предпочел делегирование, но у меня несколько отправителей. 16.02.2015

  • 3

    Добавьте наблюдателя в viewDidLoad

    - (void)viewDidLoad {
           [super viewDidLoad];
           [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
        }
    
    16.02.2015
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..