我有一个应用程序,可以从默认的NSNotificationCenter订阅特定类型的通知。
在OSX Lion上,它运行正常,但是当应用程序失去焦点(另一个应用程序变为活动状态)时,它会停止接收事件。当应用程序获得焦点时,它会再次开始接收事件。 该应用程序在以前版本的OSX上没有此行为,它总是收到通知,即使它没有聚焦。
我该怎么做才能改变这种行为?
谢谢! 森
答案 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,当应用程序处于非活动状态时,该行为不会发送通知。