NSNotification选择器被调用两次

时间:2015-04-09 05:28:46

标签: ios

我有像这样的代码结构

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

我无法理解为什么用上面的代码打印两次,只用下面的代码打印一次

2 个答案:

答案 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导航器跟踪对方法的调用。

如果没有帮助,我们希望看到您从哪里发布通知。