NSStreamEventEndEncountered не происходит для NSInputStream при чтении содержимого из файла

Я создал NSInputStream для загрузки содержимого из файла (IOS):

NSString* fileName = [[NSBundle mainBundle] pathForResource:@"resource" ofType:@".dat"];
NSInputStream* dataStream = [NSInputStream inputStreamWithFileAtPath:fileName];
if (dataStream == nil) {
    NSLog(@"load asset failed");
    return;
}

[dataStream setDelegate:self];
[dataStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                            forMode:NSDefaultRunLoopMode];
[dataStream open];

Затем добавьте обработчик событий:

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    switch(eventCode) {
        case NSStreamEventEndEncountered: {
            [stream removeFromRunLoop:[NSRunLoop currentRunLoop]
                                       forMode:NSDefaultRunLoopMode];

            break;
        }
    }
}

Я хочу поймать событие: NSStreamEventEndEncountered, но не произошло. Я могу поймать только NSStreamEventOpenCompleted и NSStreamEventHasBytesAvailable.

Ничего плохого? Спасибо за любую помощь!


person crax    schedule 22.06.2011    source источник


Ответы (3)


Я не вижу ничего плохого в коде, который вы разместили. Убедитесь, что когда вы закончите с потоком, вы закроете его самостоятельно, а не просто полагаетесь на получение уведомления NSStreamEventEndEncountered, что вы можете сделать просто с помощью чего-то вроде этого:

- (void) disconnect {
    // Close all open streams
    [inputStream close];
    [outputStream close];
}

Обычно вы получаете NSStreamEventEndEncountered только в том случае, если соединение закрыто на другом конце потока, что в зависимости от того, что вы делаете, может быть вне вашего контроля.

person Matt    schedule 22.06.2011
comment
Проблема в том, что я хочу читать данные из файла, а не из сокета, и я думаю, что если NSInputStream достигнет EOF файла, NSStreamEventEndEncountered будет уведомлен, но нет. - person crax; 22.06.2011
comment
Другая проблема теперь заключается в том, что hasBytesAvailable возвращает YES, но читается: maxLength возвращает 0.... - person crax; 22.06.2011
comment
Не могли бы вы опубликовать свой код для обработки уведомления NSStreamEventHasBytesAvailable? - person Matt; 22.06.2011
comment
Я не обрабатывал уведомление NSStreamEventHasBytesAvailable, я просто хочу получать уведомления, если NSInputStream достиг EOF файла (это означает, что NSInputStream загрузил все содержимое файла в память), чем я буду читать данные после этого - person crax; 22.06.2011

Я просто столкнулся с этим. Замените NSStreamEventEndEncountered на 4 в операторе switch/case.

NSStreamEventEndEncountered как перечисление NSStream не попадает в оператор case.

person Alex Zavatone    schedule 24.07.2014

Ни один из этих ответов не является правильным. Чтобы инициировать событие NSStreamEventEndEncountered, вы должны попытаться прочитать данные из входного потока, когда данные для чтения отсутствуют (другими словами, когда парный выходной поток перестает записывать данные).

person James Bush    schedule 14.09.2017