Что мне не хватает? : iPhone Objective-C NSInputStream initWithData - PullRequest
2 голосов
/ 19 декабря 2009

Я создаю NSInputStream из объекта NSData, но однажды созданный поток сообщает НЕТ для hasBytesAvailable:

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

Что мне здесь не хватает?

1 Ответ

6 голосов
/ 19 декабря 2009

Этот код будет работать для чтения вашего потока:

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: вернет ДА, если вы не откроете поток. Однако изначально он не будет иметь допустимых значений в буфере или лене. Я думаю, что это связано с тем, что это неблокирующая операция. Предположительно значения будут заполнены позже.

В любом случае, если вы хотите заблокировать, используйте то, что у меня есть выше. Если вы не хотите блокировать, вы должны запланировать поток ввода в цикле выполнения и реализовать метод делегата stream:handleEvent:. Однако даже это не гарантирует, что вы никогда не заблокируете. Вместо этого вы можете искать библиотеку, которая предлагает другой уровень абстракции и обрабатывает поток в отдельном потоке для вас.

...