2016-08-08 2 views
0

Я читаю метки RFID с устройства BLE. Если я прочитаю одно значение RFID, я не хочу читать одно и то же значение в течение следующей секунды. Для этого я сохраняю это значение в массиве и удаляю его, когда таймер завершает одну секунду.Как остановить NSTimer от перехода к Selector и расширить его другим способом?

{

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() никогда называемый. Устройство My BLE отправляет уведомление более чем за 10 секунд за одну секунду. Я хочу прочитать значение, если оно отличается от rfid и продлить таймер еще на одну секунду, если будет прочитано такое же rfid. timer.fireDate начинает печатать через одну секунду и время печати, равное уведомлениям с устройства BLE.

ответ

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 секунды с момента его появления.

+0

Thank u @ Paulw11. С небольшим изменением кода я смог выполнить свое требование. – Hemanth