iOS プログラムにパイプがあり、読み取るデータがあるときにメインの実行ループ (または他の実行ループ) に通知してもらいたい...
では、パイプのファイル記述子をランループに追加するにはどうすればよいでしょうか?
(内部では、アプリがイベントを受け取るために select/kqueue/poll/whatever を実行している必要があると確信しているため、その呼び出しに FD を取得するだけで問題になるはずですが、関連する情報が見つかりません適切な API 呼び出しとは何か)。
iOS プログラムにパイプがあり、読み取るデータがあるときにメインの実行ループ (または他の実行ループ) に通知してもらいたい...
では、パイプのファイル記述子をランループに追加するにはどうすればよいでしょうか?
(内部では、アプリがイベントを受け取るために select/kqueue/poll/whatever を実行している必要があると確信しているため、その呼び出しに FD を取得するだけで問題になるはずですが、関連する情報が見つかりません適切な API 呼び出しとは何か)。
GCD を使用してこれを行う方法については、Apple ドキュメントの「ディスパッチ I/O チャネルの作成と使用」セクションを参照してください。これはほぼ同じことです。簡単に言うと、dispatch_io チャネルを作成し、その読み取りをキューに入れます。
dispatch_io_t channel = dispatch_io_create(DISPATCH_IO_STREAM,
fd,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^(int error) {
});
dispatch_io_read(channel,
0,
1024,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^(bool done, dispatch_data_t data, int error) {
// Code to execute when 1024 bytes become available
});
読み取り処理キューの一部として、読み取り要求を再開する必要があります。
または、 を作成し、CFFileDescriptorRef
それを使用して を作成することもできますCFRunLoopSourceRef
。