Правильно ли вызывается read:maxLength: один раз для каждого NSStreamEventHasBytesAvailable?

Пример кода из Руководства по потоковому программированию:

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

Я прав? Пример кода неправильный?


person an0    schedule 24.03.2015    source источник


Ответы (1)


Вызов read:maxLength: один раз сработает. Если вы не прочитаете все доступные данные, вы получите еще одно событие HasBytesAvailable.

Циклическое чтение всех данных может быть проблемой. Если данные продолжают поступать, вы можете остановить выполнение других задач, запланированных в этом цикле выполнения. Если вместо этого вы прочитаете только один раз, другие задачи цикла выполнения будут разрешены до того, как будет доставлено следующее событие HasBytesAvailable.

person Greg Parker    schedule 24.03.2015