【问题标题】:NSStreamEventEndEncountered not happen for NSInputStream when read content from file从文件读取内容时,NSInputStream 不会发生 NSStreamEventEndEncountered
【发布时间】:2011-06-22 09:16:27
【问题描述】:

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

有什么问题吗?感谢您的帮助!

【问题讨论】:

    标签: objective-c ios nsinputstream


    【解决方案1】:

    我看不出您发布的代码有什么问题。确保当您完成流时您自己关闭它,而不是简单地依靠获得NSStreamEventEndEncountered 通知,您可以通过以下方式简单地做到这一点:

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

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

    【讨论】:

    • 问题是我想从文件而不是套接字中读取数据,我认为如果 NSInputStream 到达文件的 EOF,将通知 NSStreamEventEndEncountered,但不会。
    • 现在的另一个问题是 hasBytesAvailable 返回 YES,但读取:maxLength 返回 0....
    • 你能发布你的代码来处理 NSStreamEventHasBytesAvailable 通知吗?
    • 我还没有处理 NSStreamEventHasBytesAvailable 通知,我只想在 NSInputStream 已达到文件的 EOF 时收到通知(这意味着 NSInputStream 已将所有文件内容加载到内存中),然后我将读取数据那
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        相关资源
        最近更新 更多