在C ++程序中从NSNotification Server获取通知

时间:2013-06-28 15:10:46

标签: c++ objective-c macos

我在Mac上使用cmake创建一个简单的C ++应用程序。 C ++源代码文件中有一个主要的创建C ++类。在这个类中,我分配了目标C对象,它将自己添加到NSNotificationCenter中的观察者。而且我没有收到这些通知。 有一个代码:

Notifications.h

class LaunchNotification {
public:
    LaunchNotification();
    virtual ~LaunchNotification();

    void StartNotifications();
    void StopNotifications();

private:
    void    *monitor;
};

Notifications.mm

@interface Monitor : NSObject
-(id) init;
-(void) appLaunchedNotification :(NSNotification *) notification;
-(void) appTerminatedNotification :(NSNotification *) notification;
@end

@implementation Monitor

- (id) init
{
    self = [super init];
    if (self)
    {
        count = 0;
        NSNotificationCenter *notCenter = [[NSWorkspace sharedWorkspace] notificationCenter];

        [notCenter addObserver : self
            selector:@selector(appLaunchedNotification:)
            name:NSWorkspaceDidLaunchApplicationNotification
            object:nil];

        [notCenter addObserver : self
            selector:@selector(appTerminatedNotification:)
            name:NSWorkspaceDidTerminateApplicationNotification
            object:nil];
    }

    return self;
}

- (void) appLaunchedNotification : (NSNotification *) notification
{
    NSString *path = [[notification userInfo]objectForKey: @"NSApplicationPath"];
}

- (void) appTerminatedNotification : (NSNotification *) notification
{
    NSString *path = [[notification userInfo]objectForKey: @"NSApplicationPath"];
}

- (void) dealloc
{
    NSNotificationCenter *notCenter = [[NSWorkspace sharedWorkspace] notificationCenter];

    [notCenter removeObserver : self];

    [super dealloc];
}
@end

LaunchNotification::LaunchNotification() : monitor(NULL)
{}

LaunchNotification::~LaunchNotification()
{
    StopNotifications();
}

void LaunchNotification::StartNotifications()
{
    if (NULL == monitor)
    {
        monitor = [[Monitor alloc] init];
    }
}

void LaunchNotification::StopNotifications()
{
    if (NULL != monitor)
    {
        [(id)monitor release];
    }
}

1 个答案:

答案 0 :(得分:1)

您需要一个运行循环,否则,NSWorkspace没有机制来控制您的应用程序的线程以发布通知。

虽然文档说自动创建了运行循环,但它们会自动执行。想想看:线程如何同时运行代码并在运行循环中运行代码?

监控通知中心时需要执行的任何任务都需要在runloop事件的上下文中完成,例如在NSTimer事件上,或者您需要一个单独的线程来处理其他事情。