線程間的通信的幾種方式


線程間的通信:

 - 什么叫做線程間通信

 

    - 在1個進程中,線程往往不是孤立存在的,多個線程之間需要經常進行通信
 
  -  線程間通信的體現
    - 1個線程傳遞數據給另1個線程
    - 在1個線程中執行完特定任務后,轉到另1個線程繼續執行任務
  -  線程間通信常用方法
    - 方法一:利用perform的方式
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

 

     - 方法二:NSPort

   - 配置NSMachPort對象---本地線程間通信,通過傳遞端口對象變量進行端口間通訊

   基本機制:A線程(父線程)創建NSMachPort對象,並加入A線程的run loop。當創建B線程(輔助線程)時,將創建的NSMachPort對象傳遞到主體入口點,B線程(輔助線程)就可以使用相同的端口對象將消息傳回A線程(父線程)。    

   - NSPort是通過代理模式傳送消息

      - it forwards the message to its delegate in a handleMachMessage: or handlePortMessage: message.

- (void)handleMachMessage:(void *)machMessage

- (void)handlePortMessage:(NSPortMessage *)portMessage

 

  - 官方文檔翻譯

NSPort是一個描述通信通道的抽象類。通信發生在兩個NSPort對象之中,這兩個NSPort對象通常屬於不同的進程或任務。分發對象系統使用NSPort對象來返回或發送NSProtMessage對象。你應該盡可能使用分發對象來完成應用間通信,必要時才使用NSPort對象。

 

要接收發來的消息,NSPort對象必須作為輸入源被添加到NSRunLoop對象中。NSConnection對象在初始化時自動添加它們的接收端口。

 

當一個NSPort對象接收到一個端口消息,便把這條消息在handleMachMessage:或者handlePortMessge:消息中傳送給它的代理。這個代理應該至少實現其中一個方法來處理要接收的消息,不管你想要實現什么功能。handleMachMessage:提供了一個早期的Mach內核消息,它以msg_header_t結構體為起始。handlePortMessage:提供了一個作為NSPortMessage對象的消息,這個對象是Mach消息面向對象的替代品。如果沒有設置代理,這個NSPort對象會自己處理這條消息。

 

當你使用NSPort對象完成消息處理,你必須首先使這個端口對象失效,然后再發送release消息。類似的處理還有,如果你的應用使用了垃圾回收,你必須先使端口失效,然后移除它的一些強引用。如果你沒有是端口失效,就可能引起內存泄漏。要使端口失效,請調用invalidate方法。

 

基礎框架定義了三個具體的NSPort子類。NSMachPort和NSMessagePort只允許本地(在一樣的機器上)通信。NSSocketPort允許本地和遠程兩種通訊,但是對於本地通信,NSSocketPort會更加耗費資源。創建NSPort對象,可以使用allocWithZone:或port,NSMachPort對象創建例外。

 

- GCD的方式

  - 子線程回到主線程

dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 執行耗時的異步操作...
      dispatch_async(dispatch_get_main_queue(), ^{
        // 回到主線程,執行UI刷新操作
        });
});

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM