NSNotificationCenter一个帖子会导致观察者被调用两次

时间:2012-06-29 05:13:15

标签: iphone objective-c ios ipad

我有以下代码:

 [[NSNotificationCenter defaultCenter] postNotificationName:kNewsfeedFetchCompleted object:self userInfo:userinfo];

只有这一点,没有别的地方。以下是我设置观察者的方法:

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsfeedFetchCompleted:) name:kNewsfeedFetchCompleted object:nil];

问题是当我做一个帖子时,newsfeedFetchCompleted被调用了两次..这怎么可能呢?

3 个答案:

答案 0 :(得分:24)

当您的addObserver代码执行两次时,这是可能的。通知功能将在注册时多次调用。

因此,请确保添加观察者的代码仅执行一次。因此,您可以将其保存在viewDidLoad或init方法中。

如果你将它放在viewWillAppear中,那么在viewWillDisAppear中删除观察者。

答案 1 :(得分:8)

在添加观察者之前,请确保删除之前添加的观察者。

[[NSNotificationCenter defaultCenter]removeObserver:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsfeedFetchCompleted:) name:kNewsfeedFetchCompleted object:nil];

答案 2 :(得分:2)

如果您为newsfeedFetchCompleted通知多次添加了相同的观察者,则可以。您应该使用removeObserver调用匹配addObserver调用。

例如,如果您在UIViewController的viewWillAppear / viewWillDidAppear / ViewDidLoad中添加了观察者,则应在viewWillDisappear / viewDidDisappear / ViewDidUnload中删除它。

对addObserver的相应删除调用是removeObserver:name:object:

可以在NSNotificationCenter docs

中找到更多信息