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

来自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所有可用字节。

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

调用read:maxLength:一次就可以工作。 如果您没有读取所有可用的数据,那么您将收到另一个HasBytesAvailable事件。

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