我正在从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设备的通知。
答案 0 :(得分:1)
您正在安排多个计时器,因为您正在说如果timer.valid然后计划一个计时器。此外,我认为通过一个小的更改,您可以使您的代码忽略多个项目的第二个
类似的东西:
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秒钟。