【发布时间】:2022-01-07 23:53:40
【问题描述】:
我正在研究与 LED 灯通信的核心蓝牙。当外围设备将值写入通信时,需要一些时间才能得到硬件(LED)的响应。当我们使用 UISLider 写入值时,我们面临着硬件延迟。我认为每当我们快速移动滑块时都会出现队列。我该如何解决这个延迟?
let slider0:UInt8 = UInt8(sliderBrightness.value) // Brightness
let slider1:UInt8 = UInt8(mode) // Mode
let slider2:UInt8 = UInt8(sliderDirection.value) // Direction
let slider3:UInt8 = UInt8(sliderStrength.value) // Strength
let slider4:UInt8 = UInt8(sliderWhite.value) // Neutral LED Dimming
let slider5:UInt8 = UInt8(sliderOrange.value) // Warm LED Dimming
let slider6:UInt8 = UInt8(mode == 3 ? sliderOrbit.value : sliderOnTime.value) // According to Mode
let slider7:UInt8 = UInt8(sliderOffTime.value) // According to Mode
let slider8:UInt8 = UInt8(255)
let buff: [UInt8] = [slider0,slider1,slider2,slider3,slider4,slider5,slider6,slider7,slider8]
let data = Data(bytes: buff, count: buff.count)
let sliderVal = Int(sender?.value ?? 0.0)
guard let char = ledChar else {return}
if sender == nil || sliderVal % 1 == 0 {
print(sliderVal)
if sender != nil, previousValue == sliderVal {
return
}
previousValue = sliderVal
pendingRequestWorkItem?.cancel()
let requestWorkItem = DispatchWorkItem { [weak self] in
self?.writeLEDValueToChar( withCharacteristic: char, withValue: data)
}
pendingRequestWorkItem = requestWorkItem
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(12),
execute: requestWorkItem)
【问题讨论】:
-
你有什么问题?
-
@Larme 当我使用滑块将值写入 ble 硬件时,硬件会延迟以反映输出。
-
延迟多长时间?
-
@MichaelKotzjan 这取决于我移动滑块的频率。如果我给硬件一个写入输入值,它工作正常,但在滑块的情况下,用户可以非常频繁地移动滑块并且延迟即将到来
-
这听起来像
DispatchQueue是你的问题。您将每个新值放入此队列,以便将其发送到设备。 BLE 速度不够快,无法处理您的实时数据。
标签: swift bluetooth-lowenergy core-bluetooth cbcentralmanager cbperipheral