对象为NSDistributionNotificationCenter配置运行循环

时间:2015-10-11 10:51:48

标签: objective-c multithreading macos cocoa nsrunloop

我正在为我的助手任务制作一个简单的IPC模块,

我决定使用NSDistributionNotificationCenter,因为它很简单。

但是我认为它需要在我没有的runloop中运行, 所以我需要创建一个RunLoop。

我在这里阅读了有关RunLoops的文档https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

但是我不清楚,我应该怎么做这个RunLoop只用于接收和发送Notifications

有些人可以了解我的RunLoop应该包含哪些内容吗?

它应该包含计时器吗? 如何将消息监听器附加到此RunLoop

我很抱歉,如果我的问题有点愚蠢 - 我以前从未使用runloops手动搞乱。

我知道我必须创建一个线程并为其分配一个runloop, 但目前尚不清楚如何添加观察者?我应该添加任何额外的东西吗?

1 个答案:

答案 0 :(得分:2)

实际上它比我想象的容易得多 我正在回答我自己的问题,如果将来有人会为同样的事情而努力,他可能会在这里找到答案,或者至少是一个kickstart。

    BOOL done = NO;

    NSDistributedNotificationCenter * notificator = [NSDistributedNotificationCenter defaultCenter];
    [notificator addObserver:self selector:@selector(gotObject:) name:@"com.ipc.test" object:nil];

    // Add your sources or timers to the run loop and do any other setup.

    do
    {
        // Start the run loop but return after each source is handled.
        SInt32    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES);

        // If a source explicitly stopped the run loop, or if there are no
        // sources or timers, go ahead and exit.
        if ((result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished))
            done = YES;

        // Check for any other exit conditions here and set the
        // done variable as needed.
    }
    while (!done);

实际上现在我发现了更简单的解决方案

        NSDistributedNotificationCenter * notificator = [NSDistributedNotificationCenter defaultCenter];
       [notificator addObserver:self selector:@selector(gotObject:) name:@"com.ipc.test" object:nil];

        CFRunLoopRun();