Как конвертировать UnsafeMutablePointerUIImage в Swift - PullRequest
0 голосов
/ 04 июня 2019

Я пытался отправить данные изображения с Android и получить на iOS с помощью сокета, но проблема в том, что я не могу показать изображение из данных, полученных из потока.

Вот полный код: -

Настройка сетевой связи

var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
                                           ip as CFString,
                                           3003,
                                           &readStream,
                                           &writeStream)

        inputStream = readStream!.takeRetainedValue()
        outputStream = writeStream!.takeRetainedValue()
        inputStream.delegate = self
//        outputStream.delegate = self
        inputStream.schedule(in: .current, forMode: RunLoop.Mode.common)
        outputStream.schedule(in: .current, forMode: RunLoop.Mode.common)
        inputStream.open()
        outputStream.open()

Получение данных через делегатов, как показано ниже: -

extension ChatRoom: StreamDelegate {
    func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
        switch eventCode {
        case Stream.Event.hasBytesAvailable:
            print("new message received")
            readAvailableBytes(stream: aStream as! InputStream)
        case Stream.Event.endEncountered:
            print("end received")
            stopStreamSession()
        case Stream.Event.errorOccurred:
            print("error occurred")
        case Stream.Event.hasSpaceAvailable:
            print("has space available")
        case Stream.Event.openCompleted:
            print("Stream opened")
        default:
            print("some other event...")
            break
        }
    }
    private func readAvailableBytes(stream: InputStream) {
        let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: maxReadLength)
        while stream.hasBytesAvailable {

            let numberOfBytesRead = inputStream.read(buffer, maxLength: maxReadLength)

            if numberOfBytesRead < 0 {
                if let _ = stream.streamError {
                    break
                }
            }

            NSLog("number of bytes read = %i", numberOfBytesRead)

            if numberOfBytesRead > 0 {
            dataOfImage.append(buffer, count: numberOfBytesRead)

            }
        }

    }

}

Я пытался показать изображение из данных, полученных с помощью UIImage(data:dataOfImage), но он показывает ноль, когда я проверяю dataOfImage, он состоит из всех данных, полученных из потока.

Может кто-нибудь предложить способ получить изображение из UnsafeMutablePointer<UInt8> данных.

Также, если есть какой-либо лучший способ передачи данных через сокеты, пожалуйста, предложите ..

1 Ответ

0 голосов
/ 04 июня 2019

Вместо allocate в памяти объявляется buffer переменная с емкостью maxReadLength.

И stream(_:handle:) вызывается несколько раз.Вы должны проверить результат функции read

private var dataOfImage = Data()

private func readAvailableBytes(stream: InputStream) {
    var buffer = [UInt8](repeating: 0, count: maxReadLength)
    let bytesRead = inputStream.read(&buffer, maxLength: maxReadLength)
    switch bytesRead {
    case 0: // success, end of file
    case -1: // error
    default: // append data
       dataOfImage.append(contentsOf: buffer)
    }

    NSLog("number of bytes read = %i", bytesRead)
}
...