iPhone開發之守護進程和前台進程之間通訊原理

來源:互聯網
上載者:User

iPhone開發之守護進程和前台進程之間的通訊是本文要介紹的內容,當我們建立基於mobilesubstrate的應用時,通常都是一些前背景程式,典型的比如蘋果皮等,這個需要前景程式法資訊到後台進程中,這裡有兩種方式

一種是基於檔案的模式

也就是在背景程式中設定一個定時器,定時讀取使用者互動資訊的檔案,這樣實現的通訊機制,雖然也解決了問題,但是,缺陷是需要一直跑一個定時器來查詢前台是否傳遞資訊過來了

還有一種是使用CFMessagePortRef

典型的如下模式:

 
  1. #define APP_ID "yohunl.support.mach.port"  
  2. #define MACH_PORT_NAME APP_ID 

在後台進程中建立一個用於進程通訊的 CFMessagePortRef

 
  1. CFMessagePortRef local = CFMessagePortCreateLocal(kCFAllocatorDefault, 
  2. CFSTR(MACH_PORT_NAME), mouseCallBack, NULL, NULL);  
  3.   CFRunLoopSourceRef source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, local, 0);  
  4. CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes); 

其中的mouseCallback是回呼函數,其聲明是

 
  1. CFDataRef mouseCallBack(CFMessagePortRef local, SInt32 msgid, CFDataRef cfData, void *info); 

在前台進程中使用發送訊息的模式

 
  1. CFMessagePortRef bRemote = CFMessagePortCreateRemote(kCFAllocatorDefault, CFSTR(MACH_PORT_NAME));  
  2. // tell thread b to print his name  
  3. char message[255]="lingdaiping,yohunl";  
  4. CFDataRef data;  
  5. data = CFDataCreate(NULL, (UInt8 *)message, strlen(message)+1);  
  6. (void)CFMessagePortSendRequest(bRemote, CFSTR(MACH_PORT_NAME), data, 0.0, 0.0, NULL, NULL);  
  7. CFRelease(data);  
  8. CFRelease(bRemote); 

還有一種訊號量的機制,本人也還沒研究,但是看見過別的程式中有使用過,應該也是可以的!

小結:iPhone開發之守護進程和前台進程之間的通訊的內容介紹完了,希望通過本文的學習對你有所協助!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.