swift NSTimer im Hintergrund
Ich haben eine Menge Probleme mit, wie Sie zu behandeln NSTimer im hintergrund hier auf dem stack oder sonstwo. Ich habe versucht, alle Möglichkeiten, die tatsächlich Sinn gemacht .. um den timer zu stoppen, wenn die Anwendung geht in den hintergrund mit
NSNotificationCenter.defaultCenter().addObserver(self, selector: "appDidEnterBackground", name: UIApplicationDidEnterBackgroundNotification, object: nil)
und
NSNotificationCenter.defaultCenter().addObserver(self, selector: "appDidBecomeActive", name: UIApplicationWillEnterForegroundNotification, object: nil)
Zuerst dachte ich, dass mein problem gelöst ist, habe ich gerade gespeichert, die Zeit, wenn die app Tat betreten hintergrund und berechnet den Unterschied, wenn die app eingegeben Vordergrund .. aber später bemerkte ich, dass die Zeit tatsächlich verschoben 3, 4 , 5 Sekunden .. dass es eigentlich nicht das gleiche .. ich habe verglichen, um die Stoppuhr auf einem anderen Gerät.
Gibt es da WIRKLICH keine SOLIDE Lösung für die Ausführung einer NSTimer im hintergrund?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte man nicht spaßen mit Anpassungen auf der Grundlage, wenn es in hintergrund-oder Bewerbungsmappen, sondern nur speichern Sie die Zeit, die Sie zählen aus oder an (je nachdem, ob Sie das zählen nach oben oder unten). Dann, wenn die app wieder startet, verwenden Sie einfach das von/bis-Zeit beim Umbau der timer.
Ebenso, stellen Sie sicher, dass Ihre timer-handler ist nicht abhängig von den genauen Zeitpunkt, dass der Umgang mit Selektor aufgerufen wird (z.B. nicht alles tun, wie
seconds++
oder etwas ähnliches, denn es kann nicht aufgerufen werden, genau dann, wenn Sie hoffe, es wird), aber immer wieder auf, dass von/bis Zeit.Hier ist ein Beispiel für eine count-down-timer, die zeigt, dass wir uns nicht "zählen" nichts. Noch sorgen wir uns um die verstrichene Zeit zwischen
appDidEnterBackground
undappDidBecomeActive
. Speichern Sie einfach die Zeit anhalten und dann die timer-handler nur vergleicht den Ziel -stopTime
und die aktuelle Zeit und zeigt die verstrichene Zeit, aber Sie möchten.Beispiel:
Durch die Art und Weise, die oben veranschaulicht auch die Verwendung einer lokalen Benachrichtigung (falls der timer abläuft, während die app ist derzeit nicht läuft).
For Swift 2-Wiedergabe, siehe Vorherige revision dieser Antwort.
CFAbsoluteTimeGetCurrent()
oderCACurrentMediaTime()
oder[NSDate date]
) und vergleichen Sie es gegen die Grundlinie der Zeit, dass Sie unten zählen, um zu wissen, die Verbleibende Zeit.Leider gibt es keine zuverlässige Möglichkeit, regelmäßig einige Aktionen im hintergrund. Sie können Gebrauch machen von hintergrund holt, aber das OS nicht garantieren Ihnen, dass diese in regelmäßigen Abständen ausgeführt.
Während im hintergrund Ihre Anwendung ausgesetzt wird, und somit wird kein code ausgeführt, ausgenommen der oben erwähnten hintergrund holt.