2012-09-23 44 views
2

我在寫一個iOS應用程序,其中多個iDevices可以互相連接並向對方發送消息。當iDevice1向iDevice2發送消息時,我希望將該消息插入到iDevice2中的隊列中。 iDevice2上的一個單獨的後臺線程現在通過這個隊列並將消息出隊。我的問題是兩倍,如下所示:在線程和另一個輪詢線程之間共享隊列

  1. 什麼是實現後臺線程無限循環(直到應用程序終止)和輪詢和出隊列中的項目的最佳方式是什麼?
  2. 在循環後臺線程和將消息插入隊列的線程之間共享隊列的最佳方式是什麼?

我一直在使用dispatch_async宏中央調度方法來執行不同線程中的任務,它一直工作得很好。我應該使用dispatch_async方法來啓動輪詢隊列的後臺線程嗎?這種方法是否考慮切換到其他線程,或者後臺線程是否會處理處理器,因爲它正在進行無限循環?任何幫助表示讚賞,謝謝!

回答

0

你不想輪詢,這是不好的做法,它沒有很好的理由使用CPU。你想要做的就是使用一個NSMutableArray設置一個共享FIFO,並用NSConditionLock保護它的訪問。消費者任務(您可以使用NSOperation創建)將鎖定在NSConditionLock上,直到生產者任務指示FIFO中有一些數據可用。

1

這裏更重要/有趣的問題是爲什麼你有一個後臺線程(輪詢或其他方式)喂入GCD隊列,而不是簡單地將整個事情變成基於GCD的工作流程,其中塊運行在一個隊列上(可能與一個調度源或信號量)將工作提交到工作隊列中。換句話說,管理iDevice1和iDevice2的代碼都應該使用GCD編寫,並且表達了工作流的意圖,以及是否有任何手動線程管理正在進行。代碼將更容易理解,更易於維護!

0

無需輪詢隊列 - 隊列上的項目將根據隊列的語義執行。你可以這樣做:

-(dispatch_queue_t)messageQueue { 
    static dispatch_queue_t queue; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     queue = dispatch_queue_create("my message queue", DISPATCH_QUEUE_SERIAL); 
    }); 
    return queue; 
} 

-(void)didRecieveMessage:(NSString *)message { 
    dispatch_async([self messageQueue], ^{ 
     // do something with message 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // update the UI 
     }); 

    }); 
}