Доступ к опубликованным переменным из ObservedObjects внутри функции - PullRequest
1 голос
/ 15 марта 2020

У меня есть 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. Есть идеи как решить?

1 Ответ

1 голос
/ 15 марта 2020

Разве проблема не в том, что вы вызываете startLogging только один раз с начальным набором значений? Затем вы просто продолжаете печатать этот один и тот же набор значений снова и снова. Вы нигде не обращаетесь к фактическим данным (в настоящее время хранятся ваши motion и health объекты), чтобы увидеть, что это такое сейчас .

...