有没有办法在 SwiftUI 中创建 WKExtendedRuntimeSession 的新会话?
Is there a way to create a new session of WKExtendedRuntimeSession in SwiftUI?
我在 watchOS 中创建了一个简单的倒数计时器。当您按下开始时,计时器启动并且 session.start 也被声明。在后台一切正常。然后,当它通过按钮或计时器停止时,会话将失效。
顺便说一下,我正在阅读文档 here
它指出,“您一次只能安排一个会话;如果您需要重新安排一个会话,请使当前会话无效,然后安排一个新会话。”。 =12=]
所以我的问题是,如何在 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做,比如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()
}
}
}
}
}
我在 watchOS 中创建了一个简单的倒数计时器。当您按下开始时,计时器启动并且 session.start 也被声明。在后台一切正常。然后,当它通过按钮或计时器停止时,会话将失效。
顺便说一下,我正在阅读文档 here
它指出,“您一次只能安排一个会话;如果您需要重新安排一个会话,请使当前会话无效,然后安排一个新会话。”。 =12=]
所以我的问题是,如何在 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做,比如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()
}
}
}
}
}