2017-05-18 1 views
0

Ich habe ein Timer in einem Singleton erstellt und ich habe mit kämpfen, warum die Timer nicht feuert. Ich habe hier über Posts nachgesehen, aber ich habe keinen gefunden, von dem ich glaube, dass er mein Problem direkt beantwortet.Timer nicht feuern (timeInterval immer == 0.0)

class ConnectionStateMonitor : NSObject { 
    static let shared = ConnectionStateMonitor() 

    var isConnected = false 

    fileprivate let reachability = Reachability()! 
    fileprivate var reconnectTimer: Timer? 
    fileprivate var reconnectPollInterval = TimeInterval(10.0) 

    func initialise() { 
     reachability.stopNotifier() 

     reachability.whenReachable = { reachability in 

      if reachability.isReachableViaWiFi { 
       Log.debug(message: "Reachable via WiFi") 
      } else { 
       Log.debug(message: "Reachable via Cellular") 
      } 

      self.updateConnectionState(isConnected: true) 
     } 
     reachability.whenUnreachable = { reachability in 
      Log.debug(message: "Not reachable") 

      self.updateConnectionState(isConnected: false) 
     } 

     do { 
      try reachability.startNotifier() 
     } catch { 
      //print("Unable to start notifier") 
     } 
    } 

    func updateConnectionState(isConnected: Bool) { 
     let wasConnected = self.isConnected 

     Log.debug(message: "Update connection state: \(isConnected)") 

     synchronize(lockObj: self, closure: { 
      self.isConnected = isConnected 
     }) 

     self.updateReconnectTimer() 
    } 

    fileprivate func updateReconnectTimer() { 
     // Suspend any pending call. 
     self.reconnectTimer?.invalidate() 

     if !self.isConnected { 
      self.reconnectTimer = Timer.scheduledTimer(timeInterval: self.reconnectPollInterval, target: self, selector: #selector(ConnectionStateMonitor.attemptReconnect), userInfo: nil, repeats: false) 
      // Uncommenting below fires the timer. 
      //self.reconnectTimer?.fire() 


      print("attempting to reconnect in self.reconnectPollInterval = \(self.reconnectPollInterval) \(self.reconnectTimer?.timeInterval)s") 
     } 
     else { 
      self.reconnectTimer = nil 
     } 
    } 

    @objc func attemptReconnect() { 
     print("attempting to reconnect") 

     self.comms?.hello(completionHandler: { success, message in 
      self.updateReconnectTimer() 
     }) 
    } 
} 

Die print-Anweisung innerhalb updateReconnectTimer ausdruckt:

in self.reconnectPollInterval wieder zu verbinden versucht = 10,0 Optional (0.0) s

Ich kann nicht für das Leben von mir heraus Warum wäre die timeInterval-Eigenschaft meiner Timer 0.0, wenn ich sie explizit auf 10.0 setze. Der Aufruf von fire ruft meine Funktion korrekt auf, sodass ich weiß, dass sie korrekt angeschlossen ist.

Auch um zu bestätigen, gibt es keine nachfolgenden Aufrufe der updateReconnectTimer-Funktion, die stören würden.

Gibt es etwas offensichtlich, dass ich vermisse?

EDIT:

ich in mehr Code hinzugefügt haben, um das Problem zu zeigen, scheint es, dass die Timer in den Abschluss-Handler von Reachability durch die Aktualisierung, die ein Hintergrundthread zu sein scheint, die Timer von Brennen zu verhindern.

+0

das Intervall ist 0, weil es nicht wiederholt, aber der erste Start wird 10 verzögert und Ihr Code funktioniert gut für mich Ich habe es gerade getestet – zombie

+0

@zombie danke für die Erklärung auf timeInterval. Ich bin mir nicht sicher, ob ich dieses Verhalten mag, in meinen Augen erwarte ich, dass das Intervall auf das gesetzt wird, mit dem es initialisiert wurde, ob es sich wiederholt oder nicht. Das scheint mir eine seltsame Wahl zu sein. Jedenfalls habe ich in dieser Klasse andere Code-Teile, also werde ich versuchen, eine saubere Klasse wie die oben genannten zu erstellen und prüfen, ob das funktioniert – Bijington

Antwort

0

Leider schien der Fehler damit zu tun, dass ich das Feld reconnectTimer auf verschiedenen Threads aktualisiert habe. Erzwingen, dass es jedes Mal im selben Thread aktualisiert wurde, um das Problem zu beheben.