在一个iOS应用中,我正在使用CoreBlueTooth
L2CAP channel
在一个设备和另一台设备之间进行音频文件传输。它已经完成了一半,但还没有全部完成。至此,我已经转移了文件名,但是进入文件内容,情况就是这样。
在发送方,所有字节(几十万个字节)都分布在多个块中。但是在接收方,似乎只有前几千个字节到达了目的地。
功能:
func stream(_ aStream: Stream,
handle eventCode: Stream.Event) {
......
}
被调用一次(使用Stream.Event.hasBytesAvailable),并获取前几千个字节。但是,以后再也不会调用它了。可能是什么原因呢?我希望它会被调用多次,直到收到所有字节为止。
答案 0 :(得分: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)
}
}