在标签栏(视图控制器)中多次调用通知中心方法方法 ios?如何删除观察者?

Notification center method method called multiple time ios in Tab bar (View controller)? How to remove observer?

我正在从一个视图控制器发布通知,它位于标签栏应用程序的导航堆栈中。我正在删除 dealloc 中的观察者。

 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil];  in dealloc correctly.

我正在注销

[[self tabBarController] dismissViewControllerAnimated:YES completion:nil];

但问题是当我重新登录时添加了两次与通知中心相同的通知

ArtworkAddedReloadAllArtworks, 0x12ff698, 0x7a490e00, 1400
ArtworkAddedReloadAllArtworks, 0x12ff698, 0x7a431800, 1400

在通知中心创建了 2 个视图控制器实例,并且通知添加了两次两个不同的对象,如何注销通知?我无法从 viewDidDisappear 中删除,因为我发布来自其他 controller.dealloc 的通知在登录后调用。

如何制作nil view controller(登录前先创建),以及他的观察者?

提前致谢。

请检查 Interface Builder 中的 reuseIdentifier。如果你设置它,UIViewController 可以调用 viewDidLoad 多次并且只能调用一次 - dealloc。 请检查。

解决方案:

将 adding/removing 个观察者移动到 viewWillAppearviewWillDisappear

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someSelector:) name:@"ArtworkAddedReloadAllArtworks" object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil];
}

另一个解决方案(我不喜欢它,但它可以帮助):

viewDidLoad 中删除观察者,然后再添加观察者

- (void)viewDidLoad {
    [super viewDidLoad];
    // Remove previously added observer to avoid of duplicate
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ArtworkAddedReloadAllArtworks" object:nil];
    // Add new observer
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someSelector:) name:@"ArtworkAddedReloadAllArtworks" object:nil];
}
NSNotificationCenter.defaultCenter().removeObserver(self, name : UIKeyboardWillShowNotification, object: nil)

在这种情况下,任何侦听 'UIKeyboardWillShowNotification' 的观察者都将从您所在的视图控制器中删除。

如果发布 class 和观察 class 不同,我无法在观察 class 中删除观察者。

例如。在 Class 中添加了一个名为观察者的 viewWillAppear,现在我推送到 Class B 然后 Class A 的 viewWillDisappear 被调用并且观察者被删除,现在通知不会被 Class A 观察到它在推送操作时在 viewWillDisappear 中被删除。

我认为这不是正确的解决方案,但我最终通过保存观察者 class 引用并使用它来删除引用。

Class viewDidLoad方法中的A(观察Class)

  [[ASNGlobalClass shareManager] setNotificationSelf:self];//Save reference of self

Class B(任意 Class)

[[NSNotificationCenter defaultCenter] removeObserver:[[ASNGlobalClass shareManager] notificationSelf]
                                                    name:@"LookbookChangeNotification"
                                                  object:nil];