如何解决为什么在View中以这种特殊方式计算此类变量仅在Apple Watch上停止后台处理,而不在模拟器上停止后台处理?
为什么60秒钟后在View中停止Apple View上的后台处理而不是在模拟器中以这种特殊方式计算此类变量?
我从苹果公司的一个简单示例开始,该示例旨在在Apple Watch上演示HealthKit。来源是here。
该应用程序显示一个计时器,该计时器使用HealthKit允许后台处理,以便该应用程序可以继续运行。
这是Apple的代码,可让Timer在真正的Apple Watch上保持后台运行:
// WorkoutManager.swift
// Set up and start the timer.
func setUpTimer() {
start = Date()
cancellable = Timer.publish(every: 0.1,on: .main,in: .default)
.autoconnect()
.sink { [weak self] _ in
guard let self = self else { return }
self.elapsedSeconds = self.incrementElapsedTime()
// added by me to make sure the background process is continuing
print(self.elapsedSeconds)
}
}
// Calculate the elapsed time.
func incrementElapsedTime() -> Int {
let runningTime: Int = Int(-1 * (self.start.timeIntervalSinceNow))
return self.accumulatedTime + runningTime
}
// WorkoutView.swift
...
var body: some View {
VStack(alignment: .leading) {
// The workout elapsed time.
Text("\(elapsedTimeString(elapsed: secondsToHoursMinutesSeconds(seconds: workoutSession.elapsedSeconds)))").frame(alignment: .leading)
.font(Font.system(size: 26,weight: .semibold,design: .default).monospacedDigit())
...
self.elapsedSeconds
移交给一个视图,即“ WorkoutView”,并定期更新该视图,并且后台处理继续工作。
如果我使用非常简单的逻辑添加自己的变量,并尝试在WorkoutView中显示它,它将在后台继续更新约60秒(允许或接受),然后停止后台任务。如果手表的屏幕处于唤醒状态,则继续递减计数,但是一旦屏幕再次进入睡眠状态,后台进程就会停止。
// WorkoutManager.swift
...
@Published var timeLeft: Int = 2000
...
// Set up and start the timer.
func setUpTimer() {
start = Date()
cancellable = Timer.publish(every: 0.1,in: .default)
.autoconnect()
.sink { [weak self] _ in
guard let self = self else { return }
self.elapsedSeconds = self.incrementElapsedTime()
// my added variable timeLeft
self.timeLeft -= 1
print(self.timeLeft)
}
}
// WorkoutView.swift
...
Spacer().frame(width: 1,height: 8,alignment: .leading)
Text("Time Left: \(workoutSession.timeLeft)")
}
.frame(minWidth: 0,maxWidth: .infinity,minHeight: 0,maxHeight: .infinity,alignment: .leading)
}
...
我想知道为什么如果按照苹果显示的方式来设置变化的变量,背景任务仍会继续,但是如果我以其他方式创建变量,则会停止后台任务。
一切都可以从Apple提供的sleepy sloth示例中复制,并且由于我从该示例中获取并进行了全面检查,因此我认为HealthKit安装正确。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。