我在 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
.