如何在swift 2命令行工具中创建最小守护进程?

时间:2015-07-17 06:24:05

标签: xcode macos swift cocoa swift2

我想做什么

我想运行一个守护程序进程,可以在NSWorkspaceWillLaunchApplicationNotification xcode项目中监听OSX系统事件,如command line tool?那可能吗?如果没有,为什么不来,有没有任何工作或黑客?

一些代码示例

swift 2 cocoa application项目中的以下示例代码设置了一个系统事件侦听器,每次OSX应用程序启动时都会调用WillLaunchApp。 (这很好用

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(aNotification: NSNotification) {
        NSWorkspace.sharedWorkspace()
            .notificationCenter.addObserver(self,
                selector: "WillLaunchApp:",
                name: NSWorkspaceWillLaunchApplicationNotification, object: nil)
    }

    func WillLaunchApp(notification: NSNotification!) {
        print(notification)
    }
}

相比之下,类似的swift 2 command line tool项目不会调用 WillLaunchApp

import Cocoa

class MyObserver: NSObject
{
    override init() {
        super.init()
        NSWorkspace.sharedWorkspace()
            .notificationCenter.addObserver(self,
                selector: "WillLaunchApp:",
                name: NSWorkspaceWillLaunchApplicationNotification, object: nil)
    }

    func WillLaunchApp(notification: NSNotification!) {
        // is never called
        print(notification)
    }
}

let observer = MyObserver()

while true {
    // simply to keep the command line tool alive - as a daemon process
    sleep(1)
}

我猜我在这里缺少一些cocoa和/或xcode基础知识,但我无法弄清楚哪些基础知识。也许它与while-true循环有关,可能会阻塞事件。如果是,是否有正确的方式来运行守护程序进程?

2 个答案:

答案 0 :(得分:6)

事实证明,使用while true循环会阻止主线程。 只需将while true循环替换为NSRunLoop.mainRunLoop().run(),即可进行守护进程。

我读了swifter(一个基于swift的服务器)的来源,它正在做同样的事情。

答案 1 :(得分:4)

在Swift 3中,等效代码为:

RunLoop.main.run()