警告iOS/iPhone用户有关重复的NSNOTIFICAIGS观察的警告
-
28-09-2019 - |
题
这不是一个问题,而是警告他人节省一些时间。
iOS 3/iPhone OS 3上的NSNotificationCenter(我也假设Mac OS X和iOS 4)具有以下行为:
如果您多次为确切的特定通知注册自己,则NSNotificativeCenter将 不是 识别冗余,而是会向您发射尽可能多的通知,就像您注册了观察结果一样。
这几乎从来都不是您想看到的行为,几乎总是偶然的。
例子:
我希望我的视图控制器在新数据进来时从Singleton网络对象接收通知:
- (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]];
}
请注意是 确切地 相同的通知,将目的定为同一观察者,发件人和通知名称。
在这种情况下,如果我不删除其中一个Addobserver调用,我将获得视图控制器的重复通知。
在多线程的环境中,这是一个受到伤害的世界。相信我。
只是将其放在那里,以防万一其他人遇到这样的事情。
解决方案
iOS 3/iPhone OS 3上的NSNotificationCenter(我也假设Mac OS X和iOS 4)具有以下行为:
如果您多次为确切的特定通知注册自己,则NSNotificativeCenter将 不是 识别冗余,而是会向您发射尽可能多的通知,就像您注册了观察结果一样。
这几乎从来都不是您想看到的行为,几乎总是偶然的。
例子:
我希望我的视图控制器在新数据进来时从Singleton网络对象接收通知:
- (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]];
}
请注意是 确切地 相同的通知,将目的定为同一观察者,发件人和通知名称。
在这种情况下,如果我不删除其中一个Addobserver调用,我将获得视图控制器的重复通知。
在多线程的环境中,这是一个受到伤害的世界。相信我。
只是将其放在那里,以防万一其他人遇到这样的事情。
其他提示
您应该并始终清理观察者。
最简单的方法是:[[nsnotificationcenter defaultcenter] remove observer:self
ViewDidload并不是添加观察者的好地方,因为此功能可能会被多次调用,因此在触发ViewDidunload时会发生这种情况。将AddObservers放入ViewWillAppear,然后在ViewWillDisAppear中删除Overobservers的好地方。
正如您自己说的那样,NSNOTIFICAYCENTER不对重复项进行检查,这对某些人来说可能很烦人,但是在刻画其背后的完整系统时是有意义的。
相同的逻辑适用于将目标添加到某些对象中,但是对这些对象通常存在关键识别。
感谢您的见解,并提供了良好的SEO友好警告:)