Как преобразовать NSInputStream в UIImage

У меня есть NSInputStream, который я отправляю на сервер, и пока идет загрузка, я хочу отобразить загружаемое изображение. Метод находится в синглтоне и получает этот NSInputStream. Есть ли способ прочитать этот поток и преобразовать его в UIImage?

Я пробовал с этим, но не повезло. Где моя ошибка?

var buffer = [UInt8](count:1024, repeatedValue: 0)
    thumbnailStream.open()
    if (thumbnailStream.hasBytesAvailable){
        let len : Int = inputStream.read(&buffer, maxLength: buffer.count)
        var pictureData = NSData(bytes: buffer, length: len)
        var imagess = UIImage(data: pictureData)!
        self.headerProgress.imageView.image = imagess
        print("Data of image = \(pictureData.length)")

        }else{
        print("No bytes")
    }

Спасибо!


person Srdjan    schedule 23.03.2017    source источник
comment
Вы пользовались отладчиком? Что на самом деле происходит, когда вы запускаете код, который вы разместили?   -  person rmaddy    schedule 23.03.2017
comment
Переменная pictureData имеет длину счетчика буфера 1024. Я изменил значение счетчика, и длина pictureData изменилась на значение счетчика, а также произошел сбой среды выполнения, и pictureData строка кода выделена. Кроме того, я уверен, что отправляю данные изображения этому методу, потому что медиафайл успешно загружается на сервер. @rmaddy   -  person Srdjan    schedule 24.03.2017
comment
Вам нужно прочитать все данные из входного потока, а не только первые 1024 байта.   -  person rmaddy    schedule 24.03.2017
comment
Есть ли способ получить размер потока? Потому что я не могу предсказать, сколько байт имеет поток с изображением.   -  person Srdjan    schedule 24.03.2017
comment
Вы должны зацикливаться, пока не будет больше данных.   -  person rmaddy    schedule 24.03.2017
comment
О да, так что, пока «hasBytesAvailable» верно, прочитайте «1024» байта. Спасибо, я попробую.   -  person Srdjan    schedule 24.03.2017
comment
Я разобрался, теперь работает. Вы хотите, чтобы я отправил код, чтобы вы могли опубликовать ответ? Спасибо, что подали мне идею.   -  person Srdjan    schedule 24.03.2017
comment
Если вы считаете, что ответ поможет другим, не стесняйтесь опубликовать свой собственный ответ.   -  person rmaddy    schedule 24.03.2017


Ответы (1)


Я нашел решение этой проблемы, и оно в рабочем состоянии.

    var count = 0
    let dataOfTheImage = NSMutableData()
    var buffer = [UInt8](count:1024, repeatedValue: 0)
    thumbnailStream.open()

    //MARK: Loop through thumbnail stream
    while (thumbnailStream.hasBytesAvailable){
        count = count + 1
        print("Counter: \(count)")
        //MARK: Read from the stream and append bytes to NSMutableData variable
        let len  = thumbnailStream.read(&buffer, maxLength: buffer.count)
        dataOfTheImage.appendBytes(buffer, length: len)

        //MARK: Size of the image in MB
        let size = Float(dataOfTheImage.length) / 1024.0 / 1024.0
        print("Data length = \(size)")
    }

    //MARK: Check if there are no bytes left and show the image
    if (thumbnailStream.hasBytesAvailable == false){
        thumbnailStream.close()
       // var pictureData = NSData(bytes: buffer, length: len)
        let progressImage = UIImage(data: dataOfTheImage)!
        dispatch_async(dispatch_get_main_queue(), {() -> Void in
            self.headerProgress.imageView.image = progressImage
        })
    }
person Srdjan    schedule 24.03.2017