如何阻止NSTimer转到Selector并在另一种方法中扩展它?

时间:2016-08-08 07:08:07

标签: ios swift2 nstimer

我正在从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设备的通知。

1 个答案:

答案 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秒钟。