有没有办法在 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 的新会话?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在编辑时将 TextField 的光标移动到文本的末尾?- SwiftUI