调用read:maxLength:每个NSStreamEventHasBytesAvailable一次正确吗?

时间:2015-03-24 02:28:29

标签: ios nsstream

来自Stream Programming Guide的示例代码:

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {

    switch(eventCode) {
        case NSStreamEventHasBytesAvailable:
        {
            if(!_data) {
                _data = [[NSMutableData data] retain];
            }
            uint8_t buf[1024];
            unsigned int len = 0;
            len = [(NSInputStream *)stream read:buf maxLength:1024];
            if(len) {
                [_data appendBytes:(const void *)buf length:len];
                // bytesRead is an instance variable of type NSNumber.
                [bytesRead setIntValue:[bytesRead intValue]+len];
            } else {
                NSLog(@"no buffer!");
            }
            break;
        }
        // continued

如果可用字节数大于缓冲区大小怎么办?

在这种情况下,调用- read:maxLength:一次只消耗部分可用字节,但整个事件。如果它是最后一个NSStreamEventHasBytesAvailable,则剩余的字节将丢失。

所以在我看来这段代码不正确。正确的代码应该使用循环来消耗每个NSStreamEventHasBytesAvailable的所有可用字节。

我是对的吗?示例代码是错误的吗?

1 个答案:

答案 0 :(得分:3)

调用read:maxLength:一次就行了。如果您没有阅读所有可用数据,那么您将收到另一个HasBytesAvailable事件。

循环读取所有数据可能是个问题。如果数据继续到达,那么您可能会饿死在该运行循环上安排的其他任务。如果您只读了一次,那么在下一个HasBytesAvailable事件发送之前,将允许其他运行循环任务运行。