2

NSData オブジェクトから NSInputStream を作成していますが、ストリームを作成すると、hasBytesAvailable に対して NO が報告されます。

NSData* data = [outputStream propertyForKey: NSStreamDataWrittenToMemoryStreamKey]; 
NSLog(@"creating stream with data 0x%x length %d", [data bytes], [data length]);
NSInputStream *insrm = [[NSInputStream alloc] initWithData:data];
[insrm open];

uint8_t* buf = NULL;
NSUInteger len;
BOOL result = [insrm getBuffer:&buf length:&len];
BOOL hasbytes = [insrm hasBytesAvailable];
NSLog(@"getBuffer:%d hasBytes:%d", result, hasbytes);
NSLog(@"created inputstream data %d len %d", buf, len);

ログ:

[26797:20b] creating stream with data 0x7050000 length 34672
[26797:20b] getBuffer:0 hasBytes:0
[26797:20b] created inputstream data 0 len 0

ここで何が欠けていますか?

4

1 に答える 1

6

このコードは、ストリームを読み取るために機能します。

NSInputStream *insrm = [[NSInputStream alloc] initWithData:data];
[insrm open];

while ([insrm hasBytesAvailable]) {
    uint8_t buf[128];
    NSUInteger bytesRead = [insrm read:buf maxLength:128];
    NSLog(@"read %d bytes",bytesRead);
}

getBuffer:length:ストリームを開かない場合は YES を返します。ただし、最初は buf または len に有効な値がありません。これは、非ブロッキング操作であるためだと思います。おそらく値は後で入力されます。

いずれにせよ、ブロックしたい場合は、上記のものを使用してください。ブロックしたくない場合は、実行ループで入力ストリームをスケジュールし、デリゲート メソッドを実装する必要がありますstream:handleEvent:。ただし、これでもブロックされないという保証はありません。代わりに、抽象化の別のレイヤーを提供し、別のスレッドでストリームを処理するライブラリを探すことをお勧めします。

于 2009-12-19T18:11:08.553 に答える