有没有办法在SwiftUI中创建WKExtendedRuntimeSession的新会话?

问题描述

我在watchOS中创建了一个简单的倒数计时器。当您按下start时,计时器开始计时,同时也声明了session.start。在后台一切正常。然后,当它通过按钮或计时器停止时,会话将无效。

通过阅读文档here

的方式

它指出:“ 您一次只能安排一个会话;如果需要重新安排一个会话,请使当前会话无效,然后安排一个新的会话。

所以我的问题是,如何在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()
                }
      }
        
    }
    
}
}

解决方法

最好在课堂上做,例如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() } } } } }

{{1}}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...