2012-07-14 4 views
0

나는 이벤트 내부 스트림에 데이터를 쓰고 다음어떻게 Objective-C에서 출력 스트림을 열어 둘 수 있습니까?

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode 

으로 (애플의 문서에서 가져온)에서 쓸 수있는 아무것도가없는 경우

case NSStreamEventHasSpaceAvailable: 
    uint8_t *readBytes = (uint8_t *)[self.outData mutableBytes];    
    readBytes += byteIndex;    
    int dataLength = [self.outData length];    
    unsigned int length = ((dataLength - byteIndex >= 1024) ? 1024 : (dataLength - byteIndex));    
    uint8_t buffer[length];    
    (void)memcpy(buffer, readBytes, length);    
    length = [self.outputStream write:(const uint8_t *)buffer maxLength:length];    
    byteIndex += length;    
    break; 

은 그러나, 이벤트 NSStreamEventEndEncountered를 호출 출력 스트림. 그래서 출력 스트림은 버려집니다. 이 스트림을 쓰기 위해 어떻게 열어 둘 수 있습니까? Apple's documentation에 따르면 출력 스트림에 아무 것도 기록되지 않기 때문에이 이벤트가 올바르게 호출됩니다. 어떤 아이디어?

답변

0

설명서는이 시점에서 명확하지 않지만 합리적인 해석은 용량을 최대로 쓸 때 스트림이 NSStreamEventEndEncountered을 전송한다는 것입니다. 예를 들어, 파일 기반 스트림은 파일이있는 볼륨이 가득 차면 NSStreamEventEndEncountered을 보낼 수 있습니다.

"용량"은 그 이상을 쓸 수 없다는 것입니다. 스트림을 열어두면 그 지점을 지나치지 않게됩니다. 쓸 바이트가 더 많아도 스트림에 넣을 수있는 공간이 없습니다.

1

개울을 룬 루프에 넣었습니까? 예제를 보시려면 여기를 클릭하십시오 : http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server

+0

Workshed의 예제는 훌륭하고 현재 다음과 같습니다.하지만 NSStreamEventEndEncountered는 case 문에서 결코 잡히지 않는다는 버그가 있습니다. 그러나 NSStreamEventEndEncountered를 typedef가 4로 바꾼다면 잡히고 샘플이 작동을 멈 춥니 다. Ceasar의이 예제는 훌륭하지만 handleEvent 메소드에 버그가 두 개있는 것으로 보입니다. 어느 쪽이든 고정 시키면 샘플이 깨집니다. –

관련 문제