2017-03-02 11 views
3

Swift 3.x에서 우리는 보통 Data을 사용하여 이진 데이터를 처리합니다. 그것에서 당신은 대부분의 다른 중요한 유형을 생성 할 수 있고, 거기에 유용한 기능이 있습니다.데이터 객체의 InputStream 읽기

그러나 InputStream에서 Data을 어떻게 만듭니 니? 좋은 방법이 있습니까?

답변

6

좋은 방법을 찾을 수 없습니다. 우리는 안전하지 않은 물건 주위에 좋은 틱 래퍼를 만들 수 있습니다

extension Data { 
    init(reading input: InputStream) { 
     self.init() 
     input.open() 

     let bufferSize = 1024 
     let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize) 
     while input.hasBytesAvailable { 
      let read = input.read(buffer, maxLength: bufferSize) 
      self.append(buffer, count: read) 
     } 
     buffer.deallocate(capacity: bufferSize) 

     input.close() 
    } 
} 

테스트 here으로 전체 코드를 찾을 수 있습니다.

0

위의 코드는 무한 루프가 될 수 있습니다. httpbodyInpustream을 데이터로 변환하면 문제가 발생합니다. 그래서 조건을 추가합니다.

extension Data { 
    init(reading input: InputStream) { 
     self.init() 
     input.open() 

     let bufferSize = 1024 
     let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize) 
     while input.hasBytesAvailable { 
      let read = input.read(buffer, maxLength: bufferSize) 
      if (read == 0) { 
       break // added 
      } 
      self.append(buffer, count: read) 
     } 
     buffer.deallocate(capacity: bufferSize) 

     input.close() 
    } 
} 
+0

해당 스트림과 같은 소리가 들리지 않습니다. 'hasBytesAvailable'은'false'를 리턴해야합니다. 그렇지 않습니까? 'hasBytesAvailable == true'의 의미가 무엇인지 모르지만'read == 0'은 그렇습니다; 나에게 오류 시나리오처럼 들린다. – Raphael

+0

@Raphael'InputStream.read (_ buffer : UnsafeMutablePointer , maxLength len : Int) -> Int'는 에러가 있으면'-1'을, 더 이상 읽을 것이 없다면'0'을,'> 1'을 반환합니다 if 읽을 바이트가 남아 있습니다. – Andreas