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

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友好警告:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top