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

God*_*its 21 iphone macos nsnotifications nsnotificationcenter ios

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

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

如果多次注册自己的确切具体的通知,NSNotificationCenter将认识的冗余和你已注册的观察,而不是将火过许多通知你.

这几乎不是你想要看到的行为,几乎总是偶然的.

例:

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

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}
Run Code Online (Sandbox Code Playgroud)

但早些时候我已经把同样的东西放在viewWillAppear:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}
Run Code Online (Sandbox Code Playgroud)

请注意,它是完全相同的通知,解析为相同的观察者,发件人和通知名称.

在这种情况下,如果我不删除其中一个addObserver调用,我将向我的视图控制器发送重复通知.

在多线程环境中,这是一个受到伤害的世界.相信我.

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

God*_*its 2

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

如果您多次注册自己以获取确切的特定通知,NSNotificationCenter 将不会识别冗余,而是会向您发送与您注册的观察一样多的通知。

这几乎不是您希望看到的行为,而且几乎总是意外的。

例子:

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

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}
Run Code Online (Sandbox Code Playgroud)

但早些时候我已经把同样的东西放进去viewWillAppear

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是完全相同的通知,解析为相同的观察者、发送者和通知名称。

在这种情况下,如果我不删除这些 addObserver 调用之一,我将收到重复的通知到我的视图控制器。

在多线程环境中,这是一个充满伤害的世界。相信我。

只是把这个放在那里以防其他人遇到类似的事情。