我想运行一个守护程序进程,可以在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循环有关,可能会阻塞事件。如果是,是否有正确的方式来运行守护程序进程?
答案 0 :(得分:6)
事实证明,使用while true
循环会阻止主线程。
只需将while true
循环替换为NSRunLoop.mainRunLoop().run()
,即可进行守护进程。
我读了swifter(一个基于swift的服务器)的来源,它正在做同样的事情。
答案 1 :(得分:4)
在Swift 3中,等效代码为:
RunLoop.main.run()