我正在从 BLE 设备读取 RFID 标签。如果我读取一个特定的 RFID 值,我不想在下一秒读取相同的值。为此,我将该值保存在一个数组中,并在计时器完成一秒后将其删除。
{
func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?){
let rfid = (characteristic.value?.description.capitalizedString)!
if readRfids.containsObject(rfid){
if timer.valid{
self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(self.timeEnd(_:)), userInfo: nil, repeats: false)
}
}else{
timer.invalidate()
}
if !timer.valid && !readRfids.containsObject(rfid){
readRfids.addObject(rfid)
self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(self.timeEnd(_:)), userInfo: nil, repeats: false)
}
}
func timeEnd(sender: Selector){
if !timer.valid{
readRfids.removeLastObject()
}else{
print(timer.fireDate)
}
}
我面临的问题是 timeEnd(_:) 在一秒后被多次调用,而 readRfids.removeLastObject() 从未被调用。 我的 BLE 设备在一秒钟内发送通知超过 10 次。如果它是不同的 rfid,我想读取值,如果读取相同的 rfid,我想将计时器再延长一秒钟。 timer.fireDate 在一秒后开始打印,打印时间等于来自 BLE 设备的通知。
最佳答案
您正在安排多个计时器,因为您说的是if timer.valid then schedule a timer。此外,我认为通过一个小的更改,您可以让您的代码暂时忽略多个项目
类似于:
var readRfids = [String:Double]()
var timer: NSTimer
Somewhere like `init` or `viewDidLoad`
self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(self.timeEnd(_:)), userInfo: nil, repeats: true)
func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?){
if let rfid = (characteristic.value?.description.capitalizedString) {
if self.readRfids[rfid] == nil {
//Not seen recently, so process this object
}
self.readRfids[rfid] = 1.0
}
}
func timeEnd(sender: Selector){
for (rfid, remaining) in self.readRfids {
remaining = remaining - 0.1
if (remaining > 0) {
self.readRfids[rfid] = remaining
} else {
self.readRfids[rfid] = nil
}
}
}
当看到一个项目时,它会被放入一个计数为 1 的字典中。每十分之一秒,计时器就会计时并递减每个计数。当计数为 0 时,该项目将从字典中删除。这确保每个项目自被看到后仅在字典中保留 1 秒。
关于ios - 如何阻止 NSTimer 转到 Selector 并以另一种方法扩展它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38823139/