NSStreamEventEndEncountered не происходит для NSInputStream при чтении содержимого из файла - PullRequest
2 голосов
/ 22 июня 2011

Я создал 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.

Что-то не так?Спасибо за любую помощь!

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

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

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

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

0 голосов
/ 14 сентября 2017

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

0 голосов
/ 24 июля 2014

Я только что прибежал к этому. Замените NSStreamEventEndEncountered на 4 в инструкции switch / case.

NSStreamEventEndEnE, обнаруженный как перечисление NSStream, в конечном итоге не попадает в оператор case

...