Чтение 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()
    }
}
Другие вопросы по тегам