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

Posted

技术标签:

【中文标题】有没有办法在 SwiftUI 中创建 WKExtendedRuntimeSession 的新会话?【英文标题】:Is there a way to create a new session of WKExtendedRuntimeSession in SwiftUI? 【发布时间】:2020-09-25 23:57:22 【问题描述】:

我在 watchOS 中创建了一个简单的倒数计时器。当您按下开始时,计时器开始并且 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()
                
      
        
    
    


【问题讨论】:

【参考方案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()
                
            

        

    

【讨论】:

以上是关于有没有办法在 SwiftUI 中创建 WKExtendedRuntimeSession 的新会话?的主要内容,如果未能解决你的问题,请参考以下文章

SWIFTUI:- 有没有办法在滚动滚动视图时关闭弹跳?

如何在 swiftUI 中创建具有多列的列表?

如何使用 swiftUI 获取 ComboBox

有没有办法在编辑时将 TextField 的光标移动到文本的末尾?- SwiftUI

有没有更好的方法在 SwiftUI 中创建多列(数据表)列表视图

在 SwiftUI 中创建一个包含自定义类数组的列表