2009-12-19 3 views
2

내가 hasBytesAvailable에 대한 NO 스트림 보고서를있는 NSData 객체에서 NSInputStream을 생성하지만, 한 번 생성 해요 :내가 무엇을 놓치고 있습니까? : 아이폰의 목표 - 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); 

로그 :

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

는 무엇을 나는 여기에 놓치고 ?

답변

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에 유효한 값을 갖지 않습니다. 나는 이것이 비 블로킹 (non-blocking) 작업이라는 사실에 기인한다고 생각한다. 아마도 값은 나중에 채워질 것입니다.

차단하려는 경우 위의 내용을 사용하십시오. 차단하지 않으려면 실행 루프에서 입력 스트림을 예약하고 대리 메서드 stream:handleEvent:을 구현해야합니다. 그러나 이것이 그렇다고해서 결코 차단하지 않을 것이라고 보장하지는 않습니다. 대신 다른 추상화 계층을 제공하고 별도의 스레드에서 스트림을 처리하는 라이브러리를 찾고 싶을 수도 있습니다.

+0

나는 이것을 잠시 보지 못했지만 전화가 작동하지 않는 것보다 나빴던 것을 기억합니다. 'getBuffer : length :'는 스트림을 손상시키고 미래의 읽기가 실패했다. 'hasBytesAvailiable'이 어떻게 실패하는지보십시오. 그러나'getBuffer : length :'앞에 놓기 만하면됩니다. 어쨌든 일단 전화를 받으면 모든 것이 잘 작동하기 시작합니다. 어쨌든 디버그 용도로만 사용되었습니다. – gabe