用NSConnection實現不同程式間的通訊

憶江南的部落格發表於2015-10-30

用NSConnection實現不同程式間的通訊

在Mac應用程式開發中可能會這樣做:讓程式的某部分邏輯放置在一個獨立的程式之中,如檔案或程式的監控、Crash報告的回傳等等,但不同的程式之間的通訊就再所難免,今天嘗試了通過NSConnection實現不同程式間的通訊,實在是非常方便小巧,使用起來也很靈活,好的,帖程式碼。

程式1(執行緒1)中建立一個類:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- (id)init
{
    self = [super init];
    if (self) {
        // renderThread執行緒維護NSConnection的通訊.
        renderThread = [[NSThread alloc] initWithTarget:self
                                               selector:@selector(threadMain)
                                                 object:nil];
    }
    return self;
}

- (void)threadMain
{
	NSAutoreleasePool * pool = [NSAutoreleasePool new];
	NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop];
	//setup server connection
	NSConnection *serverConnection = [NSConnection new];
        //設定self為NSConnection的代理物件
        [serverConnection setRootObject:self];
        //connectionName是註冊名稱
        [serverConnection registerName:@"connectionName"];
	[myRunLoop run];
	[pool release];
}

- (void)test
{
    //do something
    NSLog("test");
}

這樣,執行緒1的程式碼就已經完成了。
下面是程式2(執行緒2)的實現部分:

1
2
3
4
//這樣就可以通過name取得註冊的NSConnection的代理物件
NSDistantObject *drawer = [NSConnection rootProxyForConnectionWithRegisteredName:@"connectionName" host:nil];
//呼叫代理物件中的方法,就跟普通物件一樣,當然如果為了讓代理物件的方法可見,可以定義公共的協議protocol
[drawer performSelector:@selector(test)];

相關文章