调用 read:maxLength: 每个 NSStreamEventHasBytesAvailable 是否正确?
Is calling read:maxLength: once for every NSStreamEventHasBytesAvailable correct?
来自 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
事件交付之前 运行。
来自 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
事件交付之前 运行。