ios - NSNotificationCenter RemoveObserver 并不总是工作

标签 ios objective-c nsnotificationcenter

通常我会在 viewWillAppear 中添加观察者,并在 viewWillDisappear 中删除它们。在这种情况下,即使 View 消失,我也需要其中一个观察者继续,以便它可以完成一些工作。为了确保观察者仅在此 View 中添加一次,我执行以下操作:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];

    [[NSNotificationCenter defaultCenter]removeObserver:self
                                                   name:@"imageSaved"
                                                 object:nil];

    [[NSNotificationCenter defaultCenter]addObserver:self
                                            selector:@selector(postMessageWithImage:)
                                                name:@"imageSaved"
                                              object:nil];


}

我已对应用程序的其余部分进行了搜索,以确保该观察者未在其他任何地方注册。不幸的是,有时(但并非所有时候)并且没有一致的因素,通知会被触发两次。我还通过断点和 NSLog 确保 postNotifcationName 不会被多次调用。我无法在 iPhone 上重现,因为问题似乎仅限于 iPad。

在进一步的故障排除中,我检查了该方法是否是从同一线程调用的(没有理由不是,只是为了检查)。如果我将 removeObserver 放入 viewWillDisappear 中,这个问题就会消失,但是,这又不是我需要的工作方式。

显然,在这种情况下,观察者被注册了两次,但我找不到原因。正如您从代码中看到的,每当注册该观察者时,它都会首先被删除。我唯一的另一个想法是 self 是否会“损坏”,导致 removeObserver 无法正常工作?

最佳答案

当 View 显示时添加观察者,当 View 消失时将其删除。

添加:

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

删除:

- (void)postMessageWithImage:(NSNotification*)aNotification
{
  [[NSNotificationCenter defaultCenter]removeObserver:self
                                                   name:@"imageSaved"
                                                 object:nil];
  // here do your job
}

这是完全有效且高效的。

关于ios - NSNotificationCenter RemoveObserver 并不总是工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25883013/

相关文章:

iphone - 在 iOS 5.0/XCode 4.2 中使用带有 ABAddressBook 的电子名片

ios - 设备重启时的 NSNotification

iphone - iOS 将 ViewController 和 AppDelegate 设置为 CoreLocation 模型类的监听器

iphone - 释放对象时内存不会减少

ios - 如何获取Facebook的个人资料图片?

iphone - 如何在iOS sdk中开发UIMockup?

objective-c - transitionFromView 和索引

ios - 在 InterfaceBuilder 中启用/禁用 NSLayoutConstraints

objective-c - Phonegap 全屏 iPad 应用程序

ios - Swift 3 协议(protocol)的可选绑定(bind)