[OSX][Swift]プロセス間通信（Distributed Notifications）

<p>以前、発表したプロセス間通信（Distributed Notifications）をSwiftで実装してみた。やってみてわかったのだが、NSConnectionはSwift未対応のようだ。使うのを控えてくれということか。</p>

<p>通知を受け取る側（DistributedServer）のコードは以下のとおり。</p>

<pre><code>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
        }
    }
}
</code></pre>

<p>通知を送る側（DistributedClient）のコードは以下のとおり。</p>

<pre><code>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)
        */
    }
}
</code></pre>

<p>DistributedServerを起動した後に、DistributedClientを起動すると、アプリケーション間で通知が送られることが確認できる。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/mac/DistributedServer">https://github.com/murakami/workbook/tree/master/mac/DistributedServer</a> - GitHub<br />
<a href="https://github.com/murakami/workbook/tree/master/mac/DistributedClient">https://github.com/murakami/workbook/tree/master/mac/DistributedClient</a> - GitHub<br />

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="http://amazon.jp/dp/0596004621">Cocoa in a Nutshell</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />