Cocoa基于文档的应用程序:观察员不总是收到通知

Cocoa基于文档的应用程序:观察员不总是收到通知,cocoa,notifications,observer-pattern,document-based,Cocoa,Notifications,Observer Pattern,Document Based,我希望有人能帮我解决通知问题。我有一个通知,看起来设置正确,但没有按预期交付。我正在开发一个基于文档的应用程序。委托/文档类在读取保存的文件时发布通知: [[NSNotificationCenter defaultCenter] postNotificationName:notifyBsplinePolyOpened object:self]; 日志记录告诉我,每当打开保存的文档时,都会到达此行 在DrawView类中,我有windowOpen通知和bsplinePoly文件打开通知的观察员:

我希望有人能帮我解决通知问题。我有一个通知,看起来设置正确,但没有按预期交付。我正在开发一个基于文档的应用程序。委托/文档类在读取保存的文件时发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:notifyBsplinePolyOpened object:self];
日志记录告诉我,每当打开保存的文档时,都会到达此行

在DrawView类中,我有windowOpen通知和bsplinePoly文件打开通知的观察员:

[[NSNotificationCenter defaultCenter] addObserver:self
                                                          selector:@selector(mainWindowOpen:)
                                                          name:NSWindowDidBecomeMainNotification
                                                          object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                                          selector:@selector(savedBspline:)
                                                          name:notifyBsplinePolyOpened
                                                          object:nil];

- (void)        mainWindowOpen:(NSNotification*) note
{
        NSLog(@"Window opened");
        _mainWindow = [note object];
}

- (void) savedBspline:(NSNotification*) note
{
        NSLog(@"savedBspline called");
        NSLog(@"note is %@", [note name]);
}
这种行为很奇怪。当我保存并关闭主窗口并重新打开它时,会收到“windowopened”消息,但不会收到“savedBspline called”消息。如果我让主窗口保持打开状态并打开以前保存的会话,则会收到“window open”(窗口打开)消息和“savedBspline called”(savedBspline called)消息


我搜索了在线讨论和Apple DevCenter文档,但没有发现这个问题

NSNotification
按预期交付()。它们是立即交付的,而不是在其他线程上,没有延迟,也没有过滤

我想说的是,当通知发出时,或者您以其他方式混淆了执行顺序时,您的一些对象尚未实例化:您说您在读取保存的文件时发布了通知,但在保存和关闭窗口时却丢失了通知


为了帮助调试,我建议您在应用程序委托中设置一个通知观察者,它只记录所有通知。然后,您可以确定所有通知都按预期交付。

NSNotification
交付按预期工作()。它们是立即交付的,而不是在其他线程上,没有延迟,也没有过滤

我想说的是,当通知发出时,或者您以其他方式混淆了执行顺序时,您的一些对象尚未实例化:您说您在读取保存的文件时发布了通知,但在保存和关闭窗口时却丢失了通知


为了帮助调试,我建议您在应用程序委托中设置一个通知观察者,它只记录所有通知。您可以确定所有通知都按预期发送。

谢谢您,尼古拉。我花了几个小时盯着我的代码看,没有成功,你的评论引导我直奔问题。观察者在DrawView类的initWithFrame方法中被调用。通过使用日志记录,我发现在打开新窗口时调用此方法之前会发送“丢失”通知。我将修改代码以添加Observer,它将在其中接收通知。谢谢Nikolai。我花了几个小时盯着我的代码看,没有成功,你的评论引导我直奔问题。观察者在DrawView类的initWithFrame方法中被调用。通过使用日志记录,我发现在打开新窗口时调用此方法之前会发送“丢失”通知。我将修改代码以添加Observer,它将在其中接收通知。