2

複数の iDevice を相互に接続して相互にメッセージを送信できる iOS アプリケーションを作成しています。iDevice1 が iDevice2 にメッセージを送信すると、そのメッセージが iDevice2 のキューに挿入されます。iDevice2 の別のバックグラウンド スレッドがこのキューを通過し、メッセージをデキューします。私の質問は2つあり、次のとおりです。

  1. (アプリが終了するまで) 無期限にループし、キューから項目をポーリングしてデキューするバックグラウンド スレッドを実装する最良の方法は何ですか?
  2. ループしているバックグラウンド スレッドとメッセージをキューに挿入するスレッドとの間でキューを共有する最善の方法は何ですか?

私はdispatch_asyncグランドセントラルディスパッチアプローチを使用して、さまざまなスレッドでタスクを実行してきましたが、非常にうまく機能しています。キューをポーリングするバックグラウンド スレッドを開始するには、dispatch_async メソッドを使用する必要がありますか? このアプローチは、他のスレッドへの切り替えを処理しますか?それとも、バックグラウンド スレッドが無期限ループを実行しているため、プロセッサを占有しますか? どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

1

ここでのより重要で興味深い質問は、バックグラウンドスレッド(ポーリングまたはその他)がGCDキューにフィードされるのに対し、ブロックが1つのキューで実行されるGCDベースのワークフロー(ディスパッチソースに関連付けられている可能性がある)を単純に作成する理由です。セマフォ)作業を作業キューに送信します。つまり、iDevice1とiDevice2の両方を管理するコードは、GCDを使用して記述し、手動のスレッド管理を行うのではなく、ワークフローの意図を表現する必要があります。コードは理解しやすく、保守しやすくなります。

于 2012-09-24T03:04:03.443 に答える
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
        });

    });
}
于 2012-09-24T17:54:41.087 に答える
0

ポーリングしたくない、それは悪い習慣です。正当な理由もなく CPU を使用します。つまり、NSMutableArray を使用して共有 fifo をセットアップし、そのアクセスを NSConditionLock で保護します。コンシューマー タスク (NSOperation で作成できる) は、プロデューサー タスクが fifo に利用可能なデータがあることを通知するまで、NSConditionLock をロックします。

于 2012-09-23T16:22:04.660 に答える