ios - NSNotificationCenter 可能会导致错误。你知道更优雅的解决方案吗?

标签 ios nsnotificationcenter

我可以两次(意外地)将观察者添加到通知中心,我将收到两次通知。 是否可以只收到一个通知?你知道更优雅的解决方案吗?

我给你看这个例子是因为这可能会导致错误。

- (void)viewDidLoad 
{
 [[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];
 [[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];
}

- (void)keyboardDidShow:(NSNotification *)ntf
{
}

最佳答案

如果您不确定是否在其他地方添加了观察者,您可以在每次添加观察者时使用以下代码

[[NSNotificationCenter defaultCenter] removeObserver:self name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];

通过这种方式,您将删除旧的(如果存在)并添加新的。

这不是 100% 的失败证明,但它是一个开始。在异步调用或其他特殊情况下,这可能会在多线程应用程序中失败。

关于ios - NSNotificationCenter 可能会导致错误。你知道更优雅的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9331675/

相关文章:

ios - 当显示或关闭 UIAlertView 时获取通知,这是从另一个类显示的

ios - Swift 通知错误 : unrecognized selector sent to instance

ios - 预期的']'和无关的']'在':'之前

ios - 在 viewDidLoad 中注册通知

ios - 推送在 iPhone 6 上不起作用

iphone - 在 objective-c 中创建多页 PDF

ios - 在 iOS 中重新加载 tableview 部分时出现残像

ios - 如何使用 UITextFields?

ios - 快速将 ECPublicKey(SecKey) 转换为 PEM 字符串

cocoa - 如何从插件 (NSBundle) 内运行的 NSMetadataQuery 接收所有通知