ios - 如何阻止 NSTimer 转到 Selector 并以另一种方法扩展它?

标签 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 设备的通知。

最佳答案

您正在安排多个计时器,因为您说的是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/

相关文章:

ios - 将 swift 2.3 转换为 swift 3 错误

objective-c - NSTextField + NSTimer

ios - 在 iPhone 启动时发送推送通知 - 通知未发送到设备

ios - 具有对象参数的特定文本字段的Swift 2 addObserver

ios - 初始化单例异步 iOS

ios - 在 Swift 中从 UITableView 中删除一个单元格

ios - 带有 TextField 和 Button 的 UIView 内的 UIView 不工作

iphone - 调整应用内屏幕截图的大小

xcode - 调用自定义计时器类

ios - 如何控制uitextview中自动滚动的速度