我有像这样的代码结构
- (id) init {
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:@"test" object:nil];
}
- (void) test
{
NSLog(@"test"); // test is printed twice
dispatch_async(dispatch_get_main_queue, ^{
[self refresh];
})
}
- (void)refresh
{
...
}
但是,遵循代码输出" test"只有一次
- (void) test
{
NSLog(@"test"); // test is printed only once
[self refresh];
}
我无法理解为什么用上面的代码打印两次,只用下面的代码打印一次
答案 0 :(得分:2)
解决方案1:首先要检查通知本身是否已发布两次。
解决方案2:即使通知仅发布一次,也会多次调用该操作,您已添加通知的观察者(无论通知是否相同)。例如,以下两行将为同一通知(aSelector)注册观察者(self)两次。
解决方案3:如果您不确定是否已添加观察者,则只需执行以下操作即可。这将确保观察者只被添加一次。
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"test" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:@"test" object:nil];
答案 1 :(得分:1)
我建议在NSLog上添加一个断点,然后使用Debug导航器跟踪对方法的调用。
如果没有帮助,我们希望看到您从哪里发布通知。