es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Guardar un valor al cerrar y restaurar el valor al abrir nuevamente.

Actualmente estoy aprendiendo SwiftUI y tengo el siguiente problema:

Mi código contiene un temporizador que cuenta el tiempo cuando se abre la aplicación. Hasta ahora funciona bien. Ahora quiero que el tiempo anterior se guarde cuando se cierra la aplicación y cuando se vuelva a abrir, se cargue ese valor y se cuente a partir de ahí.

¿Existe una manera sencilla de implementar esto?

Aquí está mi código:

struct TimeView: View {

   @State private var timeTracker = 0

   let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

   var body: some View {
       HStack{
           Text("\(timeTracker) s")
       }
       .onReceive(timer) { time in
           self.timeTracker += 1
       }
   }
}

struct TimeView_Previews: PreviewProvider {
    static var previews: some View {
        TimeView()
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de guardar y cargar el tiempo anterior cuando se cierra y se vuelve a abrir la aplicación es utilizando UserDefaults. Puedes guardar el valor actual de timeTracker en UserDefaults cuando la aplicación se cierra utilizando el valor del entorno scenePhase, y cargarlo cuando la aplicación se abre nuevamente.

    Aquí está el código modificado:

    struct TimeView: View {
    
       @State private var timeTracker = UserDefaults.standard.integer(forKey: "timeTracker")
    
       let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    
       var body: some View {
           HStack {
               Text("\(timeTracker) s")
           }
           .onReceive(timer) { time in
               self.timeTracker += 1
           }
           .onChange(of: UIApplication.shared.scenePhase) { phase in
               switch phase {
               case .background:
                   UserDefaults.standard.set(self.timeTracker, forKey: "timeTracker")
               case .inactive:
                   break
               case .active:
                   self.timeTracker = UserDefaults.standard.integer(forKey: "timeTracker")
               @unknown default:
                   break
               }
           }
       }
    }
    

    Los cambios incluyen inicializar la variable de estado timeTracker con el valor de UserDefaults, agregar un modificador onChange que escucha el valor del entorno scenePhase, y utilizar la instrucción switch para guardar el valor de timeTracker en UserDefaults cuando se cierra la aplicación (en la fase background) y cargarlo cuando se abre la aplicación (en la fase active). Se ignora la fase inactive.

    Ten en cuenta que UserDefaults no es una forma recomendada de guardar grandes cantidades de datos, pero debería ser suficiente para esta aplicación simple. Si necesitas guardar más datos, considera utilizar CoreData o una solución basada en archivos.

Comments are closed.