如何在定时器(1 秒)上写入蓝牙外围设备,而不会在多个视图中引用 class 时复制定时器

How to write to a bluetooth peripheral on a timer (1 sec), without the timer duplicating when the class is being referenced in multiple views

要从我的蓝牙外围设备接收数据,我需要向其写入字节(每次写入时都会收到响应)。目标是每 1 秒自动写入外围设备,并能够在多个视图中查看来自 class 的数据和触发功能。

我目前面临的问题是定时器放在哪里,我目前设置在这里

override init() { 
     Super.init()
     //I put the timer in this spot 
} //(in my bluetooth class)

我认为它工作得很好,直到我注意到每次我在视图结构中引用 class 时,计时器都会重复。

let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
            print("Timer fired!")
            self.WriteData() //function to write data to the peripheral
        }
struct ViewBluetoothData: View { //I have two similar views to this
    @ObservedObject var BluetoothData = BluetoothClass() //This seems to duplicate the timer
    var body: some View {
           //View where I get data from the class and trigger functions in the class
           //Example:
           Text("Voltage: \(BluetoothData.Voltage)")
           Button {BluetoothData.WriteData(Data: [0x00])} label: {Text("Write Data")}
     }
}

目前我引用了 class 3 次,这会导致定时器触发 3 次,从而向外设写入 3 次。

我还尝试在视图中放置一个计时器(它不会那样重复),但这会导致此错误:“蓝牙和接口组合[3578:1298595] [CoreBluetooth] XPC 连接无效”并尝试把它放在蓝牙的其他地方class,但也没有成功(“self”带来的各种麻烦)

我是 swift 的新手,在有关计时器的其他问题中找不到我的答案。任何帮助是极大的赞赏!希望我对我的问题的解释足够好。

它不会复制 Timer,它会创建一个带有新 Timer 的新 Class 实例,您可以尝试在开始时使用单例 - 只强制 class 的一个实例。一个长 运行 的解决方案是使用一些依赖注入解决方案来控制 class 生命周期