Чтение InputStream в объект Data
В Swift 3.x мы обычно обрабатываем двоичные данные, используя Data
; из него вы можете генерировать большинство других важных типов, и есть полезные функции для него.
Но как мне создать Data
из InputStream
? Есть хороший способ?
2 ответа
Решение
Я не мог найти хороший способ. Мы можем создать красивую оболочку для небезопасных вещей:
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()
}
}
Найти полный код с тестом здесь.
Выше кода, это может быть бесконечный цикл. Когда я конвертирую 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()
}
}