viewDidAppear中的NSNotificationCenter用法:

时间:2016-05-31 08:25:48

标签: ios notifications

我遇到了这段代码:

- (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];

}

为什么观察者首先移除,然后又添加?

2 个答案:

答案 0 :(得分:1)

如果多次添加相同的通知观察者,您也会多次收到通知。

Observers可能在VC的生命周期中使用,或者只在视图为前景或一段时间等时使用。

当视图实际可见时,将调用

viewDidAppear。在VC的生命周期中,viewDidAppear可以被多次调用(当一个模态VC - 在VC-顶部被解除并且视图再次可见时)。

因此,在这种情况下,VC希望在视图为前景时监听通知。并且由于它被多次调用,为了能够确保观察者只添加一次,你有两个选择。使用boolean变量 - isObserverAdded(更好的方法)来检查是否已添加观察者或删除并添加观察者。

答案 1 :(得分:0)

我之前看过这个成语:有人想要一个观察者,但只有一个观察者。如果第一次调用viewDidAppear,则没有观察者,因此删除它没有任何效果,并添加了一个观察者。如果第二次或更多次调用它,则删除旧观察者并添加新观察者。

我非常非常非常喜欢有一个BOOL属性来指示是否添加了观察者,然后添加观察者,如果我需要一个观察者并且属性为NO,如果我不想观察者则删除观察者并且属性为YES(您可以将该代码很好地放入BOOL属性的setter中)。

非常好的解决方案是为NSObject添加一个扩展,完成所有这些并使用关联对象存储状态。