从文件中读取内容时,NSInputStream不会发生NSStreamEventEndEncountered

时间:2011-06-22 09:16:28

标签: objective-c ios 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。

有什么不对吗?谢谢你的帮助!

3 个答案:

答案 0 :(得分:3)

我发现您发布的代码没有任何问题。确保当您完成流后自己关闭它时,而不是简单地依赖于获取NSStreamEventEndEncountered通知,您只需使用以下内容即可:

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

如果连接被流的另一端关闭,通常只会获得NSStreamEventEndEncountered,这取决于您正在做的事情可能超出您的控制范围。

答案 1 :(得分:0)

我刚刚参与其中。在switch / case语句中将NSStreamEventEndEncountered替换为4。

作为NSStream枚举的NSStreamEventEndEncountered最终没有在案例陈述中被捕获。

答案 2 :(得分:0)

这些答案都不正确。要触发NSStreamEventEndEncountered事件,必须尝试在没有要读取的数据时读取输入流中的数据(换句话说,当配对的输出流停止写入数据时)。