1

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

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

我能做些什么来改变这种行为?

谢谢!弥敦道

4

3 回答 3

5

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

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

原因:

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

IE。当应用程序处于非活动状态时,它会调用该方法

-(void)applicationDidResignActive:(NSNotification *)notification

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

解决方案:我为 NSDistributedNotificationCenter 创建了一个对象

NSDistributedNotificationCenter *center=[NSDistributedNotificationCenter defaultCenter];

然后当应用程序失去焦点时,它调用applicationDidResignActive方法,并在其中通过向setSuspended 方法发送NO使 NSDistributedNotificationCenter 对象从挂起状态重新获得。

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

然后应用程序即使失去焦点也开始观察。

于 2013-04-02T08:44:36.167 回答
4

根据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来避免内存泄漏。

于 2014-08-03T13:45:52.857 回答
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

于 2011-11-15T17:17:43.640 回答