当应用程序在Lion上失焦时,NSNotificationCenter Observer会停止接收事件

时间:2011-11-15 01:53:56

标签: cocoa osx-lion nsnotificationcenter nsnotification

我有一个应用程序,可以从默认的NSNotificationCenter订阅特定类型的通知。

在OSX Lion上,它运行正常,但是当应用程序失去焦点(另一个应用程序变为活动状态)时,它会停止接收事件。当应用程序获得焦点时,它会再次开始接收事件。 该应用程序在以前版本的OSX上没有此行为,它总是收到通知,即使它没有聚焦。

我该怎么做才能改变这种行为?

谢谢! 森

3 个答案:

答案 0 :(得分:2)

我知道回答这个问题有点晚了,仍然是我的记录,如果有人还在搜索。

我的OS X菜单栏应用程序遇到了同样的问题。我希望应用程序能够观察所有状态。

<强>原因:

当应用程序失去焦点时,观察者将被暂停。

即。当应用程序变为非活动状态时,它会调用方法

-(void)applicationDidResignActive:(NSNotification *)notification

并且默认情况下NSDistributedNotificationCenter对象被挂起。

解决方案: 我为NSDistributedNotificationCenter

创建了一个对象
NSDistributedNotificationCenter *center=[NSDistributedNotificationCenter defaultCenter];

然后当app失去焦点时,它会调用 applicationDidResignActive 方法并在里面 通过将 NO 发送到setSuspended方法,使NSDistributedNotificationCenter对象从暂停状态恢复。

-(void)applicationDidResignActive:(NSNotification *)notification
{
    [center setSuspended:NO];
}

然后app即使失去焦点也会开始观察。

答案 1 :(得分:2)

根据NSDistributionNotificationCenter参考 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDistributedNotificationCenter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000396-BCICEHHB

  

当应用程序处于非活动状态时,NSApplication类会自动挂起分布式通知传递。基于Application Kit框架的应用程序应该让AppKit管理暂停通知传递。仅限基金会的课程可能偶尔需要使用此方法。

你可以

使用

设置观察者在暂停到NSNotificationSuspensionBehaviorDeliverImmediately时的行为
- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(NSString *)notificationSender suspensionBehavior:(NSNotificationSuspensionBehavior)suspendedDeliveryBehavior
发布

或将deliverImmediately设置为YES

- (void)postNotificationName:(NSString *)notificationName object:(NSString *)notificationSender userInfo:(NSDictionary *)userInfo deliverImmediately:(BOOL)deliverImmediately

立即在暂停状态下发送通知。

并确保您不会定期查看distnoted。 我忘了我有一个旧的启动代理脚本到killall distnoted以避免内存泄漏。

答案 2 :(得分:1)

将观察者添加到NSDistributedNotificationsCenter时,默认行为已更改为NSNotificationSuspensionBehaviorCoalesce,当应用程序处于非活动状态时,该行为不会发送通知。

这里描述: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDistributedNotificationCenter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000396-5567