Swift 3.xでは、通常、Data
を使用してバイナリデータを処理します。そこから、他のほとんどの重要な型を生成でき、便利な関数があります。
しかし、どうすればData
からInputStream
を作成できますか?いい方法はありますか?
いい方法が見つかりませんでした。安全でないものの周りに素敵なラッパーを作成できます。
extension Data {
init(reading input: InputStream) throws {
self.init()
input.open()
defer {
input.close()
}
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
defer {
buffer.deallocate()
}
while input.hasBytesAvailable {
let read = input.read(buffer, maxLength: bufferSize)
if read < 0 {
//Stream error occured
throw input.streamError!
} else if read == 0 {
//EOF
break
}
self.append(buffer, count: read)
}
}
}
これはSwift 5. test(およびストリームの一部のみを読み取るバリアント)で完全なコードを検索するためのものです) ここ 。
コードの上では、無限ループになる可能性があります。 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()
}
}