警告iOS / iPhone用户有关重复的NSNotification观察

这不是一个问题,而是警告其他人为了节省一些时间。

iOS 3 / iPhone OS 3上的NSNotificationCenter(我假设Mac OS X和iOS 4)具有以下行为:

如果您多次注册自己的具体通知,NSNotificationCenter将不会识别冗余,而是会向您发送尽可能多的通知给您,因为您已经注册了一个观察。

这几乎从来不是你想看到的行为,几乎总是偶然的。

例:

我希望我的视图控制器在接收到新数据时接收来自单例networking对象的通知:

- (void) viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataArrived:) name:NewDataArrivedNotification object:[NetworkListener sharedNetworkListener]]; } 

但早些时候,我已经把相同的东西在viewWillAppear

 - (void) viewWillAppear { [super viewWillAppear]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataArrived:) name:NewDataArrivedNotification object:[NetworkListener sharedNetworkListener]]; } 

请注意,这是完全相同的通知,parsing为相同的观察员,发件人和通知名称。

在这种情况下,如果我不删除其中一个addObserver调用,我会得到重复通知给我的视图控制器。

在multithreading环境中,这是一个受到伤害的世界。 相信我。

只要把它放在那里,以防其他人遇到这样的事情。

iOS 3 / iPhone OS 3上的NSNotificationCenter(我假设Mac OS X和iOS 4)具有以下行为:

如果您多次注册自己的具体通知,NSNotificationCenter将不会识别冗余,而是会向您发送尽可能多的通知给您,因为您已经注册了一个观察。

这几乎从来不是你想看到的行为,几乎总是偶然的。

例:

我希望我的视图控制器在接收到新数据时从单例networking对象接收通知:

 - (void) viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataArrived:) name:NewDataArrivedNotification object:[NetworkListener sharedNetworkListener]]; } 

但早些时候,我已经把相同的东西在viewWillAppear

 - (void) viewWillAppear { [super viewWillAppear]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataArrived:) name:NewDataArrivedNotification object:[NetworkListener sharedNetworkListener]]; } 

请注意,这是完全相同的通知,parsing为相同的观察员,发件人和通知名称。

在这种情况下,如果我不删除其中一个addObserver调用,我会得到重复通知给我的视图控制器。

在multithreading环境中,这是一个受到伤害的世界。 相信我。

只要把它放在那里,以防其他人遇到这样的事情。

你应该并且总是清理你的观察者。
最简单的方法是:[[NSNotificationCenter defaultCenter] removeObserver:self]
viewDidLoad不是添加观察者的好地方,因为这个函数可能被多次调用,当viewDidUnload被触发时会发生这种情况。 将viewObjects放入viewWillAppear和removeObservers in viewWillDisappear的好地方。

正如你自己所说,NSNotificationCenter不检查重复,这可能是一些恼人的,但有意义的时候,全面的系统背后。

同样的逻辑也适用于将某些对象添加到某些对象,但通常对这些对象有一个重要的认识。

感谢您的洞察力,并为一个良好的,友好的SEO警告:)