2

我创建了一个 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。

哪里不对了?谢谢你的帮助!

4

3 回答 3

3

我看不出你发布的代码有什么问题。确保当您完成流时您自己关闭它,而不是简单地依赖于获取NSStreamEventEndEncountered通知,您可以简单地使用以下方法来完成:

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

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

于 2011-06-22T11:17:07.067 回答
0

我刚碰到这个。在 switch/case 语句中将 NSStreamEventEndEncountered 替换为 4。

NSStreamEventEndEncountered 作为 NSStream 枚举最终不会被 case 语句捕获。

于 2014-07-24T17:41:55.380 回答
0

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

于 2017-09-14T02:11:47.883 回答