以前、発表したプロセス間通信(Distributed Notifications)をSwiftで実装してみた。やってみてわかったのだが、NSConnectionはSwift未対応のようだ。使うのを控えてくれということか。
通知を受け取る側(DistributedServer)のコードは以下のとおり。
import Foundation
import Cocoa
protocol RemoteObjectProtocol {
func receiveString(string: String)
}
class AppDelegate: NSObject, NSApplicationDelegate, RemoteObjectProtocol {
@IBOutlet var window: NSWindow?
@IBOutlet var label: NSTextField?
func applicationDidFinishLaunching(notification: NSNotification) {
debugPrint(__FUNCTION__)
_registerForNotes()
_registerForDistributedObjects()
}
func _registerForNotes() {
debugPrint(__FUNCTION__)
let dnc = NSDistributedNotificationCenter.defaultCenter()
dnc.addObserver(self, selector: "_handleDistributedNote:", name: "DemoDistributedNote", object: nil)
}
func _handleDistributedNote(note: NSNotification) {
debugPrint(__FUNCTION__, "Recieived Distributed Notification!:", note)
if let label = self.label {
label.stringValue = "Recieived Distributed Notification!"
}
}
func _registerForDistributedObjects() {
debugPrint(__FUNCTION__)
/*
let conn = NSConnection.defaultConnection()
conn.rootObject = self
if !conn.registerName("DistributedServer") {
debugPrint(__FUNCTION__, "error")
}
*/
}
func receiveString(string: String) {
debugPrint(__FUNCTION__)
if let label = self.label {
label.stringValue = string
}
}
}
通知を送る側(DistributedClient)のコードは以下のとおり。
import Foundation
import Cocoa
protocol RemoteObjectProtocol {
func receiveString(string: String)
}
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet var window: NSWindow?
func applicationDidFinishLaunching(notification: NSNotification) {
debugPrint(__FUNCTION__)
// _postNotes()
}
@IBAction func postNotes(sender: AnyObject) {
debugPrint(__FUNCTION__)
_postNotes()
}
@IBAction func postForDistributedObjects(sender: AnyObject) {
debugPrint(__FUNCTION__)
_postForDistributedObjects()
}
func _postNotes() {
debugPrint(__FUNCTION__)
let dnc = NSDistributedNotificationCenter.defaultCenter()
dnc.postNotificationName("DemoDistributedNote", object: nil)
}
func _postForDistributedObjects() {
debugPrint(__FUNCTION__)
/*
let remoteObject = NSConnection.rootProxyForConnectionWithRegisteredName("DistributedServer", host: "")
remoteObject.setProtocolForProxy("RemoteObjectProtocol")
remoteObject.receiveString(NSDate.date().description)
*/
}
}
DistributedServerを起動した後に、DistributedClientを起動すると、アプリケーション間で通知が送られることが確認できる。
ソースコード
GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/DistributedServer - GitHub
https://github.com/murakami/workbook/tree/master/mac/DistributedClient - GitHub
関連情報
Cocoa Advent Calendar 2015
Cocoa in a Nutshell
【Cocoa練習帳】
http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)