質問

既存のいくつかを置き換えるコードを書いています:

while(runEventLoop){
  if(select(openSockets, readFDS, writeFDS, errFDS, timeout) > 0){
    // check file descriptors for activity and dispatch events based on same 
  }
} 

ソケット読み取りコード。これを変更してGCDキューを使用して、「次のイテレーションで呼び出される必要がある」アレイを維持する代わりに、Dispatch_asyncを使用してキューにイベントをポップできるようにしたいと思います。また、私はすでにGCDキューを使用して /この特定のアクションを封じ込めているため、より自然なGCDディスパッチフォームに委ねたいと考えています。 (しばらくない()シリアルキューを独占するループ)

ただし、これをリファクタリングしようとしたとき、Dispatch_Source_Type_ReadおよびDispatch_Source_The_Type_Writeに結び付けられたイベントハンドラーから発射されたディスパッチソースに依存しているフォームに、このスケジューリングに依存していたライブラリコードが動作を停止しました。私の最初の仮定は、Dispatch_source_type_readとdispatch_source_type_writeの使用を誤解していることです - 私はそれらがそれらのソケット記述子でselect()を呼び出すのとほぼ同じ動作をもたらすと仮定していました。

GCDディスパッチソースを誤解していますか?または、リファクタルに関しては、私はそれが最適ではない状況でそれを使用していますか?

役に立ちましたか?

解決

あなたの質問に対する短い答えは、なしです。違いはありません。GCDディスパッチソースの両方と select() 同じことをしてください。特定のカーネルイベントが発生したこと、または特定の条件が当てはまることをユーザーに通知します。

MacまたはiOSデバイスでは使用しないでください select(), 、むしろより高度です kqueue()kevent() (また kevent64()).

コードを確実に変換してGCDディスパッチソースを使用する場合がありますが、これに依存して他のコードを破らないように注意する必要があります。したがって、これには、コード処理信号、ファイル記述子、ソケット、その他すべての低レベルカーネルイベントを完全に検査する必要があります。

より簡単なソリューションである可能性があります。元のコードを維持することで、イベントに反応する部品にGCDコードを追加するだけです。ここでは、特定のタイプのイベントに応じて、異なるキューでイベントを派遣します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top