我遇到了这段代码:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self name:Hide object:nil];
[nc addObserver:self selector:@selector(MarkHide:) name:Hide object:nil];
}
为什么观察者首先移除,然后又添加?
答案 0 :(得分:1)
如果多次添加相同的通知观察者,您也会多次收到通知。
Observers
可能在VC的生命周期中使用,或者只在视图为前景或一段时间等时使用。
viewDidAppear
。在VC的生命周期中,viewDidAppear
可以被多次调用(当一个模态VC - 在VC-顶部被解除并且视图再次可见时)。
因此,在这种情况下,VC希望在视图为前景时监听通知。并且由于它被多次调用,为了能够确保观察者只添加一次,你有两个选择。使用boolean
变量 - isObserverAdded
(更好的方法)来检查是否已添加观察者或删除并添加观察者。
答案 1 :(得分:0)
我之前看过这个成语:有人想要一个观察者,但只有一个观察者。如果第一次调用viewDidAppear,则没有观察者,因此删除它没有任何效果,并添加了一个观察者。如果第二次或更多次调用它,则删除旧观察者并添加新观察者。
我非常非常非常喜欢有一个BOOL属性来指示是否添加了观察者,然后添加观察者,如果我需要一个观察者并且属性为NO,如果我不想观察者则删除观察者并且属性为YES(您可以将该代码很好地放入BOOL属性的setter中)。
非常好的解决方案是为NSObject添加一个扩展,完成所有这些并使用关联对象存储状态。