我的工作是核心蓝牙通信与LED灯。当外围设备将值写入通信时,需要一些时间从硬件(.As)中获得响应,我们使用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)发布于 2021-12-03 05:44:51
您可以尝试的一件事是将所有的分派队列一起删除并直接写入值。当然,有些值将不会被写入,因为手机仍将处理最后的值传输。您可以简单地忽略此错误。像这样的东西可以起作用:
if sender == nil || sliderVal % 1 == 0 {
print(sliderVal)
if sender != nil, previousValue == sliderVal {
return
}
previousValue = sliderVal
writeLEDValueToChar( withCharacteristic: char, withValue: data)
}另一种方法可以是通过设置滑块的步距宽度而不使用滑块中的所有可能值:
Slider(
value: $speed,
in: 0...100,
step: 5
)这样你就只能得到0,5,10,15,.而不是0.0000,0.0001,0.0002,,这将在移动滑块时减少DispatchQueue中的条目数量。
https://stackoverflow.com/questions/70183375
复制相似问题