iPhone開發(fā)之守護進程和前臺進程之間通信原理
iPhone開發(fā)之守護進程和前臺進程之間的通信是本文要介紹的內(nèi)容,當(dāng)我們創(chuàng)建基于mobilesubstrate的應(yīng)用時,通常都是一些前后臺程序,典型的比如蘋果皮等,這個需要前臺程序法信息到后臺進程中,這里有兩種方式
一種是基于文件的模式
也就是在后臺程序中設(shè)定一個定時器,定時讀取用戶交互信息的文件,這樣實現(xiàn)的通信機制,雖然也解決了問題,但是,缺陷是需要一直跑一個定時器來查詢前臺是否傳遞信息過來了
還有一種是使用CFMessagePortRef
典型的如下模式:
- #define APP_ID "yohunl.support.mach.port"
- #define MACH_PORT_NAME APP_ID
在后臺進程中創(chuàng)建一個用于進程通訊的 CFMessagePortRef
- CFMessagePortRef local = CFMessagePortCreateLocal(kCFAllocatorDefault,
- CFSTR(MACH_PORT_NAME), mouseCallBack, NULL, NULL);
- CFRunLoopSourceRef source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, local, 0);
- CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);
其中的mouseCallback是回調(diào)函數(shù),其聲明是
- CFDataRef mouseCallBack(CFMessagePortRef local, SInt32 msgid, CFDataRef cfData, void *info);
在前臺進程中使用發(fā)送消息的模式
- 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);
還有一種信號量的機制,本人也還沒研究,但是看見過別的程序中有使用過,應(yīng)該也是可以的!
小結(jié):iPhone開發(fā)之守護進程和前臺進程之間的通信的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)對你有所幫助!