iPhone開發之守護進程和前台進程之間的通訊是本文要介紹的內容,當我們建立基於mobilesubstrate的應用時,通常都是一些前背景程式,典型的比如蘋果皮等,這個需要前景程式法資訊到後台進程中,這裡有兩種方式
一種是基於檔案的模式
也就是在背景程式中設定一個定時器,定時讀取使用者互動資訊的檔案,這樣實現的通訊機制,雖然也解決了問題,但是,缺陷是需要一直跑一個定時器來查詢前台是否傳遞資訊過來了
還有一種是使用CFMessagePortRef
典型的如下模式:
- #define APP_ID "yohunl.support.mach.port"
- #define MACH_PORT_NAME APP_ID
在後台進程中建立一個用於進程通訊的 CFMessagePortRef
- CFMessagePortRef local = CFMessagePortCreateLocal(kCFAllocatorDefault,
- CFSTR(MACH_PORT_NAME), mouseCallBack, NULL, NULL);
- CFRunLoopSourceRef source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, local, 0);
- CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);
其中的mouseCallback是回呼函數,其聲明是
- CFDataRef mouseCallBack(CFMessagePortRef local, SInt32 msgid, CFDataRef cfData, void *info);
在前台進程中使用發送訊息的模式
- CFMessagePortRef bRemote = CFMessagePortCreateRemote(kCFAllocatorDefault, CFSTR(MACH_PORT_NAME));
- // tell thread b to print his name
- char message[255]="lingdaiping,yohunl";
- CFDataRef data;
- data = CFDataCreate(NULL, (UInt8 *)message, strlen(message)+1);
- (void)CFMessagePortSendRequest(bRemote, CFSTR(MACH_PORT_NAME), data, 0.0, 0.0, NULL, NULL);
- CFRelease(data);
- CFRelease(bRemote);
還有一種訊號量的機制,本人也還沒研究,但是看見過別的程式中有使用過,應該也是可以的!
小結:iPhone開發之守護進程和前台進程之間的通訊的內容介紹完了,希望通過本文的學習對你有所協助!