2

我正试图围绕hasSpaceAvailableNSOutputStream 背后的逻辑。

在我的应用程序中,我通过由 NSInput/output 流管理的 CFSocket 发送大量数据(100MB),分成 4080 字节的块(硬限制)。

当我开始写入数据时,大约四分之一hasSpaceAvailable突然变成NO,所以我将数据添加到队列中。但是,如果我忽略这一点并尝试写入数据,则写入似乎可以作为write:maxLength:与 maxLength 参数(4080)匹配的返回值。

输出流有什么空间?据我所知,在使用 UNIX/Berkley 套接字时,没有可用于确定套接字是否可以写入的逻辑,您只需编写并确定是否所有数据都已写入。

该物业的文件指出:

一个布尔值,指示是否可以写入接收器。(只读)
YES如果可以写入接收器,或者是否必须尝试写入以确定是否有可用空间,NO否则。

在我看到 NO 的示例中,当我仍然可以写入该套接字时,是什么因素导致了这个结果。

4

1 回答 1

0

认为hasSpaceAvailable 属性只会返回 YES,如果自上次调用 write 方法以来流已发送“可用空间”流事件。您不应该轮询该属性,并且可以说它甚至不应该存在。相反,您应该等待输出流上的流事件,该事件表明有空间可用于写入。

当该流事件发生时,这意味着传出数据包队列的字节数至少比套接字配置为允许您排队的最大字节数少一个字节。换句话说,套接字上的 send() 或 write() 系统调用保证写入至少一个字节而不阻塞,并且保证套接字处于非阻塞模式。

请注意,在您写入数据后,如果流的缓冲区可以接收更多数据(或者如果缓冲区已满,则在它发送了一些数据之后),流将立即发送另一个可用空间事件。

于 2016-08-07T07:33:00.847 回答