"关于ViewWillAppear和。的NSNotificationCenter ViewWillDisappear"
我们指出以下方向作为首选方法
"在viewWillAppear中注册通知并取消注册 在viewWillDisappear中似乎是一个干净,对称的解决方案 我"
这种方法也在this other stackoverflow answer中提出。
我的问题是双重的
为什么Apple' AAPLCameraViewController.m " viewDidDisappear 中的removeObservers
,而上述答案建议不是viewWillDisappear
。
为什么他们在 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];
}
答案 0 :(得分:1)
添加和删除观察者的位置取决于您的需求。在许多情况下,您可能希望在其中一个init...
方法或viewDidLoad
中添加观察者,并在dealloc
中将其删除。
无论如何,应该存在某种对称性,因此每次添加都会被删除一次。
添加viewWillAppear
和viewDidAppear
之间确实没有实际区别,并且在viewWillDisappear
和viewDidDisappear
中删除之间确实没有实际区别。如果这些差异很重要,这将是一种罕见的通知。是否在调用[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实施的考虑是什么?
**添加viewWillAppear还有一些其他AVFoundation特定原因,但上面的解释应该总结症结。
答案 3 :(得分:0)
当控制器的视图对用户不可见时(因此之前出现和消失后),示例代码尝试创建和删除观察者,以便增强用户的体验(避免空白例如,屏幕,或在视图可见时重绘。)
至于第二个问题,它似乎主要是一种偏好。我也这样做:子类允许父级首先初始化,然后去初始化。