Ios 调用read:maxLength:onest for eventhasbytesavailable正确吗?

Ios 调用read:maxLength:onest for eventhasbytesavailable正确吗?,ios,nsstream,Ios,Nsstream,示例代码来自: 如果可用字节数大于缓冲区大小怎么办 在这种情况下,一次调用-read:maxLength:只会消耗部分可用字节,但会消耗整个事件。如果它是最后一个可用的nsstreamventhasbytesavailable,则剩余的字节将丢失 所以在我看来,这个代码是不正确的。正确的代码应该使用循环来消耗每个可用的nsstreamventhasbytesavailable的所有可用字节 我说得对吗?示例代码是否错误?调用read:maxLength:一次即可。如果未读取所有可用数据,则将收到

示例代码来自:

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

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

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


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

调用
read:maxLength:
一次即可。如果未读取所有可用数据,则将收到另一个
HasBytesAvailable
事件

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

- (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