tasks modes swift timer background

swift - modes - tiempo de cálculo rápido para temporizadores que se ejecutan en segundo plano



timer in background swift 4 (1)

Personalmente, consideraría la duración combinada de A y B como un "ciclo". Y luego, cuando la aplicación se reinicie, haré los cálculos del módulo para determinar (a) cuántos ciclos han pasado desde que se inició el temporizador A la primera vez; y (b) calcular dónde estamos dentro del ciclo actual. A partir de eso, puede calcular fácilmente la cantidad de tiempo restante hasta la siguiente aparición de cada temporizador:

let elapsed = NSDate().timeIntervalSinceDate(startTime) let totalDuration = durationOfTimerA + durationOfTimerB let whereInCycle = elapsed % totalDuration let cycleCount = Int(elapsed / totalDuration) var timeUntilNextA: Double var timeUntilNextB: Double if whereInCycle < durationOfTimerA { timeUntilNextA = durationOfTimerA - whereInCycle timeUntilNextB = timeUntilNextA + durationOfTimerB } else { timeUntilNextB = durationOfTimerA + durationOfTimerB - whereInCycle timeUntilNextA = timeUntilNextB + durationOfTimerA } if cycleCount < 1 { if whereInCycle < durationOfTimerA { print("timer A hasn''t fired yet") } else { print("timer A has fired, but B hasn''t") } } else { if whereInCycle < durationOfTimerA { print("both timers A and B have fired /(cycleCount) times, and waiting for A to fire next") } else { print("timers A has fired /(cycleCount+1) times, but B has fired only /(cycleCount) times; we waiting for B to fire next") } } print("A will fire in /(timeUntilNextA) seconds; B will fire in /(timeUntilNextB)")

Quiero ejecutar 2 temporizadores intercambiables pero quiero que se "ejecuten" incluso si la aplicación está en segundo plano.

El comportamiento deseable es que el usuario inicie el temporizador, pase a segundo plano y simplemente espere a que se activen las notificaciones de los temporizadores intercambiables ... los temporizadores pueden intercambiarse muchas veces. Cuando el usuario vuelve a poner la aplicación en primer plano ... quiere ver la hora exacta del temporizador actual.

Los temporizadores funcionan en segundo plano cuando están en iOS Simulator, pero no en un dispositivo ...

De acuerdo con la imagen que adjunté, estoy tratando de calcular la X La hora en que el temporizador actual debería expirar y adquirir la hora actual de acuerdo con la hora de finalización. El código sigue:

func appDidBecomeActive(){ // TODO: calculate time spend in background isInBackground = false if let startTime = startTime{ let now = NSDate() var timeFromBegining = now.timeIntervalSinceDate(startTime) while timeFromBegining > userDefaultsHelper.timerAseconds(){ timeFromBegining -= userDefaultsHelper.timerAseconds() timerType = .tiemrTypeB let stopTimeSeconds = userDefaultsHelper.timerBseconds() - timeFromBegining stopTime = NSDate().dateByAddingTimeInterval(stopTimeSeconds) print("Time from Begining: /(timeFromBegining)") if timeFromBegining > userDefaultsHelper.timerBseconds(){ timeFromBegining -= userDefaultsHelper.timerBseconds() timerType = .timerTypeA // TODO: do something with the remaining time ... let stopTimeSeconds = userDefaultsHelper.timerAseconds() - timeFromBegining stopTime = NSDate().dateByAddingTimeInterval(stopTimeSeconds) print("Time from Begining: /(timeFromBegining)") } } } }