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