iphone - iOS/iPhone 用户关于重复 NSNotification 观察的警告

标签 iphone ios macos nsnotificationcenter nsnotifications

这与其说是一个问题,不如说是对其他人节省时间的警告。

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

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

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

例子:

我希望我的 View Controller 在收到新数据时从单例网络对象接收通知:

- (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 调用,我将收到我的 View Controller 的重复通知。

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

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

最佳答案

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

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

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

例子:

我希望我的 View Controller 在收到新数据时从单例网络对象接收通知:

- (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 调用,我将收到我的 View Controller 的重复通知。

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

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

关于iphone - iOS/iPhone 用户关于重复 NSNotification 观察的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3072811/

相关文章:

iphone - 如何调整 UISwitch 的大小?

android - 用Cordova显示本地保存的图片

ios - 如何全屏显示图像的 ScrollView ?

iphone - 使用 colorWithPatternImage : 时如何保持图像透明度

iphone - 子类化 UITableViewCell 后标签将不会显示文本

iphone - 如何从 JSON 中获取数据?

iOS SQLite : Insert statement fails, 看不到为什么

c++ - 倒带 std::cout 以回到行首

linux - 如何将 Qt 应用程序从一个操作系统(linux)交叉编译到其他操作系统(Windows 和 MAC)?

尽管 Android 文件传输检测到设备,但 Android ADB 未在 Mac OS X 中检测到设备