ios - 如何将 POSIX 文件描述符添加到 iOS 运行循环以便指示何时可以读取数据?

标签 ios select asynchronous pipe runloop

我在 iOS 程序中有一个管道,我希望主运行循环(或任何其他运行循环)在有数据要读取时通知我...

那么如何将管道的文件描述符添加到运行循环中呢?

(我很确定应用程序必须在后台运行 select/kqueue/poll/whatever 来接收它的事件,所以它应该只是让 FD 调用该调用的问题,但我找不到有关什么是正确的 API 调用的相关信息。)

最佳答案

参见Creating and Using a Dispatch I/O Channel部分在 Apple 文档中了解如何使用 GCD 执行此操作,这大致相同。简而言之,您想创建一个 dispatch_io channel ,并在其上排队读取:

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

关于ios - 如何将 POSIX 文件描述符添加到 iOS 运行循环以便指示何时可以读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23818046/

相关文章:

javascript - javascript中的异步操作

javascript - HTML 选择 : how to set drop down text

node.js - 使用node序列化redis数据

ios - 如何在 RestKit 中定义不在同一 JSON 文档中的实体之间的关系映射?

iOS Storyboard和注入(inject)属性

C++ select 停止接受连接

excel vba选择列

google-app-engine - App Engine Java 8 标准环境下的 Servlet 异步处理支持

ios - J2objc 添加 .o 文件到 Xcode

ios - 删除内部触摸时的文本字段值