2009-12-19 3 views
2

Je crée un nsInputStream d'un objet NSData mais une fois créé les rapports de flux NO pour hasBytesAvailable:Qu'est-ce qui me manque? : IPhone Objective-C nsInputStream initWithData

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); 

Log:

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

Qu'est-ce que je manque ici ?

Répondre

6

Ce code fonctionnera pour la lecture de votre flux:

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: retournera OUI si vous n'ouvrez pas le flux. Cependant, il n'aura pas initialement des valeurs valides dans buf ou len. Je pense que cela est dû au fait que c'est une opération non bloquante. Les valeurs seront probablement remplies plus tard.

Dans tous les cas, si vous voulez bloquer, utilisez ce que j'ai ci-dessus. Si vous ne voulez pas bloquer, vous devez planifier le flux d'entrée sur la boucle d'exécution et implémenter la méthode de délégation stream:handleEvent:. Cependant, même cela ne garantit pas que vous ne bloquerez jamais. Au lieu de cela, vous pouvez rechercher une bibliothèque qui offre une autre couche d'abstraction et gère le flux sur un thread séparé pour vous.

+0

Je n'ai pas regardé cela depuis un moment mais je me souviens que c'était pire que l'appel ne fonctionnait pas. Le 'getBuffer: length:' semblait corrompre le flux et les futures lectures échouaient. Voyez comment 'hasBytesAvailiable' échoue? Mais ça marcherait très bien si je le mettais avant le 'getBuffer: length:'. Quoi qu'il en soit, tout a commencé à fonctionner correctement une fois que j'ai pris l'appel. Il était juste là pour des fins de débogage de toute façon. – gabe

Questions connexes