[OSX][Swift]プロセス間通信(Distributed Notifications) | Cocoa練習帳

[OSX][Swift]プロセス間通信(Distributed Notifications)

以前、発表したプロセス間通信(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/(ミラー・サイト)