0

在 iOS 应用程序中,我正在使用CoreBlueTooth L2CAP channel, 在一台设备和另一台设备之间进行音频文件传输。它已经工作了一半,但还没有完全工作。此时我已经转移了文件名,但是来到文件内容,情况是这样的。

在发送端,所有字节都被发送(几十万字节)分布在几个块中。但在接收端,似乎只有前几千个字节到达目的地。

功能:

func stream(_ aStream: Stream,
            handle eventCode: Stream.Event) {
    ......
}

被调用一次(使用 Stream.Event.hasBytesAvailable)并获取前几千个字节。但后来它再也没有被调用过。这可能是什么原因?我希望在收到所有字节之前尽可能多次调用它。

4

1 回答 1

0

完成后,read您需要检查流的属性,如果为真,则hasBytesAvailable发出另一个。read可能不会调用事件处理程序。

例如:

func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
    switch eventCode {
    case Stream.Event.openCompleted:
        print("Stream is open")
    case Stream.Event.endEncountered:
        print("End Encountered")
    case Stream.Event.hasBytesAvailable:
        print("Bytes are available")
        self.readBytes(from: aStream as! InputStream)
    case Stream.Event.hasSpaceAvailable:
        print("Space is available")
    case Stream.Event.errorOccurred:
        print("Stream error")
    default:
        print("Unknown stream event")
    }
}

func readBytes(from stream: InputStream) {
    let bufLength = 1024
    let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufLength)
    let bytesRead = stream.read(buffer, maxLength: bufLength)
    print("bytesRead = \(bytesRead)")
    self.bytesReceived += bytesRead
    if stream.hasBytesAvailable {
        self.readBytes(from: stream)
    }
}
于 2019-09-03T08:57:49.760 回答