0

Как видно на this stackoverflow answer оNSNotificationCenter, ViewWillAppear, ViewWillDisappear и ViewDidDisappear

"NSNotificationCenter по отношению к ViewWillAppear и ViewWillDisappear"

Мы указывали в направлении ниже в качестве предпочтительного подхода

"Регистрация уведомления в поле зренияWillAppear и отмена регистрации в представленииWillDisappear кажется чистым и симметричным решением для меня. "

Этот подход также предлагается в this other stackoverflow answer.

Мой вопрос двояко

  1. Почему Apple, AVCam Sample Code в "AAPLCameraViewController.m" removeObservers в viewDidDisappear и не viewWillDisappear, как вышеуказанные ответы предложили.

  2. Почему они используют addObserversпосле[super viewWillAppear:animated]; в то время как они removeObserversперед тем[super viewDidDisappear:animated];

кодекса извлеченного из "AAPLCameraViewController.m"

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

    dispatch_async(self.sessionQueue, ^{ 
    switch (self.setupResult) { 
    case AVCamSetupResultSuccess: { 
     // Only setup observers and start the session running if setup succeeded. 
     [self addObservers]; 
     [self.session startRunning]; 
     self.sessionRunning = self.session.isRunning; 
     break; 
    } 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    dispatch_async(self.sessionQueue, ^{ 
    if (self.setupResult == AVCamSetupResultSuccess) { 
     [self.session stopRunning]; 
     [self removeObservers]; 
    } 
    }); 

    [super viewDidDisappear:animated]; 
} 

ответ

1

Нет единого правила/способа регистрации для прослушивания события и отмены регистрации для него. Это полностью зависит от требований и потока программы.

Что касается ваших вопросов:

1) Почему AVCam Пример кода от Apple в "AAPLCameraViewController.m" removeObservers в viewDidDisappear и не viewWillDisappear как выше ответы предложил.

Образец кода Apple в основном касается взаимодействия с пользователем. Поэтому он должен наблюдать за событиями, когда пользователь действительно может видеть вид и взаимодействовать с ним. Наблюдатель удаляется в viewDidDisappear, поскольку в этот момент времени пользователь не сможет больше взаимодействовать с представлением. viewWillDisappear определяет состояние в жизненном цикле контроллера view, которое необходимо удалить, но еще не удалено. Поэтому теоретически лучше прекратить прослушивание события, когда оно больше не произойдет (здесь viewDidDisappear). Хотя код может работать, даже если событие не зарегистрировано в viewWillDisappear, но в некоторых случаях кодер мог бы поместить много кода в основной поток в viewWillDisappear и прекратить прослушивание событий. В этом случае некоторые события могут быть пропущены.

2) Почему они используют addObservers после [super viewWillAppear: animated]; пока они удаляютObservers до [super viewDidDisappear: animated];

Наблюдателя добавлен viewWillAppear, потому что жизненный цикл для события собирается запуск (Пользователь взаимодействует с видом). На самом деле не имеет значения, зарегистрировано ли событие до/после [super viewDidDisappear: animated]. В соответствии с архитектурой программирования, последовавшей в объектно-ориентированных языках, очистка дочерних классов предшествует родительским/суперклассам. Таким образом, очистка (удаление наблюдателя) в дочернем выполняется до очистки в Parent. Добавление наблюдателя в viewWillAppear и удаление в viewDidDisappear обеспечивает добавление наблюдателя до начала и окончания события после окончания события (что требует программа).

Что я рассматриваю для реализации NSNotificationCenter?

  1. Жизненный цикл события, в котором понадобятся наблюдатели.
  2. Когда регистрироваться на мероприятие? (Перед тем, как событие вот-вот начнется)
  3. Когда нужно отменить регистрацию для мероприятия? (После того, как событие закончилось).
  4. Любая очистка необходима после незарегистрированных событий.

** Есть несколько других особых условий AVFoundation для добавления в viewWillAppear, но приведенное выше объяснение должно подвести итог.

1

Где вы добавляете и удаление наблюдателей зависит от ваших потребностей. Во многих случаях вы хотели бы добавить наблюдателя в один из методов init... или viewDidLoad и удалить его в dealloc.

Независимо, должна быть какая-то симметрия, поэтому она удаляется один раз для каждого добавления.

Там действительно нет практической разницы между добавлением в viewWillAppear и viewDidAppear и есть на самом деле нет практической разницы между удалением в viewWillDisappear и viewDidDisappear. Это будет редкое уведомление, в котором эти различия имеют значение. То же самое для того, выполняется ли добавление или удаление до или после вызова до [super ...].

Пример Apple - хорошая модель для подражания. Вещи настраиваются до того, как представление будет отображаться и очищаться после того, как представление исчезнет. Но опять же, это действительно зависит от того, с каким уведомлением вы имеете дело, и когда вы хотите прослушать уведомление.

Спросите себя, когда вам нужно знать об уведомлении. Это в течение всего срока действия контроллера вида? Это только пока это видно? Это от того, как это видно сразу после того, как это не так?

Ответ на этот вопрос определяет наилучшие методы для добавления и удаления наблюдателя.

1

Может быть сделан случай, что viewWillAppear и viewDidDisappear представляют собой сбалансированную пару, не являющуюся viewWillAppear и viewWillDisappear. Мысль заключается в том, чтобы настроить viewWillAppear, прежде чем вид будет виден, и очистить в viewDidDisappear после его удаления. Ваш код будет установлен на весь период видимости.

0

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

Что касается второго вопроса, это, по-видимому, в основном предпочтительнее. Я делаю то же самое: подкласс позволяет родительскому инициализировать сначала и де-инициализировать последний.

Смежные вопросы