Есть ли способ создать новый сеанс WKExtendedRuntimeSession в SwiftUI?

#swiftui #watchkit #apple-watch

#swiftui #watchkit #apple-watch

Вопрос:

Я создал простой таймер обратного отсчета в watchOS. При нажатии кнопки start запускается таймер и также объявляется session.start. В фоновом режиме все работает нормально. Затем, когда он останавливается либо кнопкой, либо таймером, сеанс становится недействительным.

Кстати, я читаю документацию здесь

В нем говорится: «Вы можете планировать только один сеанс одновременно; если вам нужно перенести сеанс, аннулируйте текущий сеанс и запланируйте новый».

Итак, мой вопрос в том, как мне создать новый сеанс в SwiftUI?Вот мой код:

 import SwiftUI

struct TestView: View {
    @State var start = false
    @State var number = 10
    @State var time = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var session = WKExtendedRuntimeSession()
    var body: some View {
        VStack {
            Text("(number)")
            Spacer()
            Button(action: {
                self.start.toggle()
                if self.start {
                    session.start()
                } else {
                    session.invalidate()
                }
            }) {
                Text(self.start ? "Stop" : "Start")
            }
        }.onReceive(self.time) { (_) in
            if self.start {
                if number > 0 {
                    number -= 1
                } else {
                    self.start.toggle()
                    number = 10
                    session.invalidate()
                }
      }
        
    }
    
}
}
  

Ответ №1:

Это лучше делать в классе, например Coordinator

 class SessionCoordinator {
    private var session: WKExtendedRuntimeSession?

    func start() {
        guard session?.state != .running else { return }

        // create or recreate session if needed
        if nil == session || session?.state == .invalid {
            session = WKExtendedRuntimeSession()
        }
        session?.start()
    }

    func invalidate() {
        session?.invalidate()
    }
}

struct TestView: View {
    let coordinator = SessionCoordinator()
    @State var start = false
    @State var number = 10
    @State var time = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var body: some View {
        VStack {
            Text("(number)")
            Spacer()
            Button(action: {
                self.start.toggle()
                if self.start {
                    coordinator.start()
                } else {
                    coordinator.invalidate()
                }
            }) {
                Text(self.start ? "Stop" : "Start")
            }
        }.onReceive(self.time) { (_) in
            if self.start {
                if number > 0 {
                    number -= 1
                } else {
                    self.start.toggle()
                    number = 10
                    coordinator.invalidate()
                }
            }

        }

    }
}