2017-01-09 6 views
0

Ich erstelle Timer und Schleife so.Ich kann nicht aufhören Timer

private var iteration:Int = 0 
private var syncTimer:Timer? = Timer() 

//MARK: - Singleton 
static let synchronizationInstance:DeviceSynchronization = DeviceSynchronization() 
private init(){ 
} 

public func synchronizeAllDevices(){   
     let when = DispatchTime.now() + 2 
     DispatchQueue.main.asyncAfter(deadline: when) { 
      self.syncTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(DeviceSynchronization.synchronizeDevices), userInfo: nil, repeats: true) 
      self.syncTimer?.fire() 
     } 
    } 
} 

@objc private func synchronizeDevices(){ 
    if iteration >= 7 { 
     syncTimer?.invalidate() 
     syncTimer = nil 
     iteration = 0 
    } else { 
     devicesList![iteration].synchroniseState() 
     iteration += 1 
    } 
} 

Wenn es sieben Wiederholungen erreicht syncTimer?.invalidate() und syncTimer = nil sollte syncTimer stoppen, aber es passiert nichts. Timer funktioniert immer noch. Ich weiß nicht, hier ist ein Fehler.

+1

Sie könnten die 'synchronizeAllDevices' wieder irgendwo in Ihrem Code genannt werden, '.invalidate()' sollte gut funktionieren – Tj3n

+1

Soweit ich Ihren Code oben getestet (ich musste eine unausgewogene schließende Klammer verschieben), funktionierte Ihr Code wie erwartet. Wie Tj3n vorgeschlagen hat, hast du irgendwo Fehler, die du versteckst. – OOPer

+0

Ich bin nicht sicher, wo ist die Implementierung der Klasse _DeviceSynchronization_, aber nach dem ersten Blick, dass es scheint, die '#selector (DeviceSynchronization.synchronizeDevices)' soll dies sein: '#selector (DeviceSynchronization.synchronizationInstance.synchronizeDevices) 'stattdessen; aber es ist nicht klar, ob dieser Ausschnitt aus/in der tatsächlichen _DeviceSynchronization_ Klasse oder nicht. – holex

Antwort

0

Mein Sync-Code wird gestartet, wenn die App eine Verbindung zum Server herstellt In Stream.Event.openCompleted.

Nach 2 Sekunden versuche ich alle Geräte (Objekte) in der Liste zu synchronisieren. Ich habe festgestellt, dass dieses Ereignis zweimal ausgelöst wird und ich weiß nicht warum, aber das hat 2 Timer in Singleton erstellt ...

Gelöst! Mein Problem war, wenn Stream.Event.openCompleted zweimal ausgelöst wurde, das ist, warum meine Synchronisationsklasse zwei Timer erstellt ... Ich löste das Problem durch Erstellen einer wahren/falschen Variable "IsSyncIsInProgress".

Verwandte Themen