我正在开发一个应用程序,它可以连接到同一个本地WiFi网络上的一个设备。这个设备进行测量,并将数据传输到iPhone。iPhone真实的绘制数据。
我遇到的问题是iPhone每半秒左右延迟数据包200毫秒,这导致了UI明显的口吃,我想消除这种现象。
我通过在接收数据包时在代码中放置路标开始调试这个问题。
查看探查器,您可以很容易地看到数据中的差距。
放大间隔后的空间,可以看到接收到突发的数据包。
我已经检查过了,它没有丢弃任何数据包。它只是延迟了我的应用程序。
奇怪的是,这不是模拟器或Android版本应用程序的问题,所以我知道这不是设备或WiFi网络的问题。
下面是在模拟器上运行的相同代码,显示了更均匀的数据包分布。
有人经历过类似的事情吗?这只是iPhone硬件的某种电池节省限制吗?是否有任何方法可以确保数据更及时地传递到我的应用程序?
我试着用SwiftNIO重写连接,结果还是一样,我也试着把连接的serviceClass
参数修改成所有可能的值,没有任何变化。
以下是相关的连接代码。
private func udpReceive() {
if udpConnection?.state == .ready {
udpConnection?.receive(minimumIncompleteLength: 1, maximumLength: Int(Hangboard.shared.BufferSize), completion: { content, contentContext, isComplete, error in
os_signpost(
.begin,
log: log,
name: "udpReceive",
signpostID: signpostID
)
Task {
if let content = content {
let _ = await asyncResult(for: Hangboard.shared.udpDataReceivedNative(data: content.toKotlinByteArray(), offset: 0, length: Int32(content.count)))
}
os_signpost(
.end,
log: log,
name: "udpReceive",
signpostID: signpostID
)
self.udpReceive()
}
})
} else {
disconnect(hadError: true)
}
}
private func startUdpListener(port: NWEndpoint.Port) {
let params = NWParameters.udp
params.allowFastOpen = true
params.serviceClass = .responsiveData
let listener = try? NWListener(using: params, on: port)
self.udpListener = listener
listener?.newConnectionLimit = 1
listener?.newConnectionHandler = { connection in
connection.parameters.serviceClass = .responsiveData
self.startUdpConnection(connection: connection)
}
listener?.start(queue: .global(qos: .userInteractive))
}
private func startUdpConnection(connection: NWConnection) {
self.udpConnection = connection
connection.stateUpdateHandler = { state in
switch state {
case .ready:
self.udpReceive()
case .failed(let error):
print("Connection error! \(error.localizedDescription)")
self.disconnect(hadError: true)
default:
break
}
}
connection.start(queue: .global(qos: .userInteractive))
}
1条答案
按热度按时间jm2pwxwz1#
原来这样做的原因是因为我还在后台运行一个Bonjour搜索。
在连接时禁用搜索并在断开连接时重新启动它消除了延迟问题。
苹果的技术支持提到,当
includePeerToPeer
在连接上启用时,这可能是一个问题。