NSNotificationCenter,ViewWillAppear,ViewWillDisappear和ViewDidDisappear

时间:2016-05-06 22:27:52

标签: ios objective-c uiviewcontroller avfoundation nsnotificationcenter

this stackoverflow answer中所见

  

"关于ViewWillAppear和。的NSNotificationCenter   ViewWillDisappear"

我们指出以下方向作为首选方法

  

"在viewWillAppear中注册通知并取消注册   在viewWillDisappear中似乎是一个干净,对称的解决方案   我"

这种方法也在this other stackoverflow answer中提出。

我的问题是双重的

  1. 为什么Apple' AAPLCameraViewController.m " viewDidDisappear 中的removeObservers,而上述答案建议不是viewWillDisappear

  2. 为什么他们在 addObservers之后使用[super viewWillAppear:animated]; 虽然他们removeObservers 之前 [super viewDidDisappear:animated];

  3. 代码摘自" 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];
    }
    

4 个答案:

答案 0 :(得分:1)

添加和删除观察者的位置取决于您的需求。在许多情况下,您可能希望在其中一个init...方法或viewDidLoad中添加观察者,并在dealloc中将其删除。

无论如何,应该存在某种对称性,因此每次添加都会被删除一次。

添加viewWillAppearviewDidAppear之间确实没有实际区别,并且在viewWillDisappearviewDidDisappear中删除之间确实没有实际区别。如果这些差异很重要,这将是一种罕见的通知。是否在调用[super ...]之前或之后完成添加或删除。

Apple的榜样是一个很好的榜样。在视图显示之前设置事物并在视图消失后清理。但同样,这实际上取决于您正在处理的通知以及何时想要收听通知。

问问自己何时需要了解通知。它是在视图控制器的整个生命周期中吗?它只是在它可见的时候吗?它是在它可见之前还是它之后才是它?

该问题的答案决定了添加和删除观察者的最佳方法。

答案 1 :(得分:1)

可以说viewWillAppear和viewDidDisappear是平衡对而不是viewWillAppear和viewWillDisappear。我们的想法是在视图可见之前在viewWillAppear中进行设置,并在删除之后在viewDidDisappear中进行清理。您的代码将在视图可见的整个持续时间内就位。

答案 2 :(得分:1)

没有单一的规则/方式可以注册来监听事件并取消注册。这完全取决于要求和程序流程。

关于你的问题:

  

1)为什么Apple的AVCam示例代码在" AAPLCameraViewController.m"   viewDidDisappear中的removeObservers而不是viewWillDisappear   以上答案建议。

Apple的示例代码主要处理用户交互。因此,当用户可以实际看到视图并与之交互时,需要观察事件。观察者将在 viewDidDisappear 中删除,因为此时此刻用户无法再与该视图进行交互。 viewWillDisappear 在视图控制器的生命周期中定义了一个状态,即视图即将被删除但尚未被移除。因此,从理论上讲,它最好停止在不再发生事件时听一个事件(这里是viewDidDisappear)。虽然,即使事件在 viewWillDisappear 中未注册,代码也可能有效,但在某些情况下,编码器可能会在viewWillDisappear中的主线程上放置大量代码并停止侦听事件。在这种情况下,可能会遗漏一些事件。

  

2)为什么他们在[super]之后使用addObservers   viewWillAppear中:动画];虽然他们在[超级]之前删除了Observers   viewDidDisappear:动画];

观察者被添加到 viewWillAppear ,因为事件的事件生命周期将开始(用户与视图交互)。事件是否在 [super viewDidDisappear:animated] 之前/之后注册并不重要。根据面向目标语言中遵循的编程体系结构,子类的清理先于它的父类/超类。因此,在Parent中清理之前完成了对子进行清理(删除观察者)。在 viewWillAppear 中添加观察者并在viewDidDisappear中删除可确保在事件开始之前添加观察者并在事件结束后结束(程序需要的内容)。

我对NSNotificationCenter实施的考虑是什么?

  1. 需要观察员的事件的生命周期。
  2. 何时注册活动?(活动即将开始前)
  3. 何时取消注册活动?(活动结束后)。
  4. 取消注册活动后需要进行任何清理。
  5. **添加viewWillAppear还有一些其他AVFoundation特定原因,但上面的解释应该总结症结。

答案 3 :(得分:0)

当控制器的视图对用户不可见时(因此之前出现和消失后),示例代码尝试创建和删除观察者,以便增强用户的体验(避免空白例如,屏幕,或在视图可见时重绘。)

至于第二个问题,它似乎主要是一种偏好。我也这样做:子类允许父级首先初始化,然后去初始化。