У меня есть 2 класса (один для HealthKit, а другой для CoreMotion), которые присваивают значения некоторым опубликованным переменным, к которым я затем обращаюсь через мой основной файл swiftui. Мое представление контента получает обновления правильно. Все идет нормально. Теперь я хочу записать вывод этих переменных на консоль. Я мог бы сделать это напрямую, войдя в систему непосредственно из класса, но проблема в том, что мне нужно, чтобы выходные данные для обоих классов были в одной строке. Я написал новую функцию для этого, но значения не обновляются. Кто-нибудь, кто может мне помочь? Это потому, что функция вызывается только один раз, поэтому все параметры всегда являются параметрами при вызове функции?
мой основной файл contentView.swift:
import SwiftUI
struct ContentView: View {
@State var isActive: Bool = false
@ObservedObject var motion = MotionManager()
@ObservedObject var health = HealthKitManager()
private var logger = ConsoleLogger()
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Indicator(title: "X:", value: motion.rotationX)
Indicator(title: "Y:", value: motion.rotationY)
Indicator(title: "Z:", value: motion.rotationZ)
Divider()
Indicator(title: "Pitch:", value: motion.pitch)
Indicator(title: "Roll:", value: motion.roll)
Indicator(title: "Yaw:", value: motion.yaw)
Divider()
Indicator(title: "HR:", value: health.heartRateValue)
}
.padding(.horizontal, 10)
Button(action: {
self.isActive.toggle()
self.isActive ? self.start() : self.stop()
}) {
Text(isActive ? "Stop" : "Start")
}
.background(isActive ? Color.green : Color.blue)
.cornerRadius(10)
}.onAppear {
self.health.autorizeHealthKit()
}
}
private func start() {
self.motion.startMotionUpdates()
self.health.fetchHeartRateData(quantityTypeIdentifier: .heartRate)
self.logger.startLogging(rotationX: self.motion.rotationX, rotationY: self.motion.rotationY, rotationZ: self.motion.rotationZ, pitch: self.motion.pitch, roll: self.motion.roll, yaw: self.motion.yaw, heartRate: self.health.heartRateValue)
}
private func stop() {
self.motion.stopMotionUpdates()
self.health.stopFetchingHeartRateData()
self.logger.stopLogging()
}
}
struct Indicator: View {
var title: String
var value: Double
var body: some View {
HStack {
Text(title)
.font(.footnote)
.foregroundColor(.blue)
Text("\(value)")
.font(.footnote)
}
}
}
А вот мой файл consoleLogger.swift
import Foundation
import os.log
class ConsoleLogger {
private var timer: Timer?
func startLogging(rotationX: Double, rotationY: Double, rotationZ: Double, pitch: Double, roll: Double, yaw: Double, heartRate: Double) {
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { _ in
let timestamp = Date().timeIntervalSince1970
os_log("Motion: %@, %@, %@, %@, %@, %@, %@, %@",
String(timestamp),
String(rotationX),
String(rotationY),
String(rotationZ),
String(pitch),
String(roll),
String(yaw),
String(heartRate)
)
})
}
func stopLogging() {
timer?.invalidate()
}
}
Итак, мой таймер работает, я вижу выводить в консоль каждую секунду, однако все переменные (кроме метки времени, созданной в классе) имеют начальное значение 0.0. Есть идеи как решить?