NSStream:是否有阻止阻止的密闭防御?

时间:2015-06-20 08:18:02

标签: objective-c cocoa cocoa-touch stream

Stream Programming Guide: Polling versus Run-Loop Scheduling部分下,最后一段说:

  

应该指出的是,无论是轮询还是运行循环   调度方法是防止阻塞的密闭防御。如果   NSInputStream hasBytesAvailable方法或NSOutputStream   hasSpaceAvailable方法返回NO,这意味着在两种情况下都是   流肯定没有可用的字节或空格。但是,如果是的话   这些方法返回YES,它可能意味着有可用   字节或空格或唯一的方法是尝试读取   或写操作(可能导致瞬间阻塞)。该   NSStreamEventHasBytesAvailableNSStreamEventHasSpaceAvailable   流事件具有相同的语义。

因此,它似乎既不是hasBytesAvailable / hasSpaceAvailable,也不是流事件提供了阻止阻止的保证。有没有办法通过流获得保证的非阻塞行为?我可以创建一个后台线程来保证非阻塞行为,但我想避免这样做。

此外,我无法理解为什么NSStream无法提供保证的非阻塞行为,因为低级API(select,kqueue等)可以这样做。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

您可以在不同的主题中运行阅读或写作,也可以使用NSStream。没有其他方法可以保证无阻塞行为。

对于常规文件和套接字,如果在runloop上安排流,则很可能会出现非阻塞行为。但是还有其他类型的流未在文件描述符之上实现。通过将基类记录为并非总是非阻塞,Apple保留了以不能保证非阻塞属性的方式实现不同流的选项。

但由于我们无法检查源代码,因此我们只能推测这一点。您可能希望向Apple提交一个错误,要求他们使用该信息更新文档。