在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)]; |