gpt4 book ai didi

ios - NSNotificationCenter RemoveObserver 并不总是工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:03:57 28 4
gpt4 key购买 nike

通常我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com