我正试图围绕NSOutputStream上的hasSpaceAvailable
背后的逻辑。
在我的应用程序中,我将大量数据(100MB)分发到由NSInput /输出流管理的CFSocket上的4080byte块(硬限制)。
当我开始编写数据时,大约四分之一通过hasSpaceAvailable
突然变为NO
,因此我将数据添加到队列中。但是,如果我忽略它并尝试反正写入数据,则写入似乎与write:maxLength:
的返回值匹配maxLength参数(4080)。
输出流有什么空间?据我所知,当使用UNIX / Berkley套接字时,没有可用的逻辑来确定是否可以写入套接字,只需编写并确定是否所有数据都已写入。
该物业的文件说明:
一个布尔值,指示是否可以写入接收器。 (只读)
YES
如果可以写入接收器或者必须尝试写入以确定空间是否可用,则NO
。
在我看到NO的示例中,当我仍然可以写入该套接字时,导致此结果的因素是什么。
答案 0 :(得分:0)
我认为如果自上次调用write方法以来流已发送“空间可用”流事件,则hasSpaceAvailable属性只返回YES。你不应该对该财产进行民意调查,它甚至不应该存在。相反,您应该等待输出流上的流事件,该事件表明有可用于写入的空间。
当发生该流事件时,这意味着传出数据包队列的字符数至少少于套接字配置为允许您排队的最大字节数。换句话说,套接字上的send()或write()系统调用保证至少写入一个字节而不会阻塞,并保证套接字处于非阻塞模式。
请注意,在您写入数据之后,如果流的缓冲区可以获取更多数据(或者如果缓冲区已满,则在发送了一些数据之后),流将立即发送另一个空间可用事件。