2

ファイル (IOS) からコンテンツをロードするために NSInputStream を作成しました。

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 に置き換えます。

NSStream 列挙型として NSStreamEventEndEncountered が case ステートメントで捕捉されない。

于 2014-07-24T17:41:55.380 に答える