Ios SwiftUI:如何处理BLE响应并显示新值

Ios SwiftUI:如何处理BLE响应并显示新值,ios,swift,swiftui,bluetooth-lowenergy,Ios,Swift,Swiftui,Bluetooth Lowenergy,我有一个swift应用程序,可以与小型可编程设备进行通信。我可以发送请求并从设备上获取答案,但我很难更新swiftui视图上显示的值 以下是我尝试过的: 通过回调: 在BleConnection.swift文件中,实现了所有BLE内容,我声明了一个回调var onResponse:(([UInt8])->Void)=无 当从设备接收到响应时,通过回调将数据推送到视图: func peripheral(_ peripheral: CBPeripheral, didUpdateValueFo

我有一个swift应用程序,可以与小型可编程设备进行通信。我可以发送请求并从设备上获取答案,但我很难更新swiftui视图上显示的值

以下是我尝试过的:

  • 通过回调:
  • 在BleConnection.swift文件中,实现了所有BLE内容,我声明了一个回调
    var onResponse:(([UInt8])->Void)=无
    当从设备接收到响应时,通过回调将数据推送到视图:

        func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    ...
                if self.onResponse != nil {
                        self.onResponse!(characteristic.value!.bytes)
                    }
                }
            }
        }
    
    在ReaderInformations.swift文件中,有swiftui视图,我实现了回调,并尝试用
    @State var
    更新组件显示值,但没有成功。回调中的print()在控制台中打印良好,但组件未更新。然后我读到只有视图的内部方法才能更新状态变量

  • 使用联合收割机: 我更新了外围设备(didUpdateValueFor)并发送了BLE设备响应,如下所示:
  • let passThroughSubjectPublisher=PassthroughSubject()
    func外围设备(uPeripal:CbPeripal,didUpdateValueFor characteristic:CBCharacteristic,error:error?){
    ...
    passThroughSubjectPublisher.send(characteristic.value!.bytes)
    }
    }
    
    并且认为:

    struct ReaderInformations: View {
        var ble: BleConnection
        @State private var status: String = "status" 
        private var cancelSet: Set<AnyCancellable> = []
    
    
        init(bleInstance: BleConnection) {
            passThroughSubjectPublisher.sink(receiveValue: { response in. // Escaping closure captures mutating 'self' parameter
                 switch response[0] {
                     self.status = "TEST".   // This error because of the self
                 ...
                 }
            }).store(in: &cancelSet)
        }
    
    结构读取器信息:视图{ 变量ble:ble连接 @状态私有变量状态:String=“status” 私有变量cancelSet:Set=[] 初始化(bleInstance:BleConnection){ passThroughSubjectPublisher.sink(receiveValue:{response in//转义闭包捕获变异的'self'参数 开关响应[0]{ self.status=“TEST”。//此错误是由于self ... } }).store(在:&cancelSet中) } 我也不工作,因为我尝试在init中访问一个甚至还没有实例化的成员


    所以我现在不知道该怎么做。你们会怎么做呢?

    将发布者的观察者附加到正文中,就像下面的伪代码一样

    struct ReaderInformations: View {
        var ble: BleConnection
        @State private var status: String = "status" 
    
        var body: some View {
    
           VStack { // .. any your view
    
    
           }
           .onReceive(ble.passThroughSubjectPublisher) { response in // << here !!
                  switch response[0] {
                     self.status = "TEST"
                  ///...
                 }
            }
        }
    }
    
    结构读取器信息:视图{ 变量ble:ble连接 @状态私有变量状态:String=“status” var body:一些观点{ VStack{//…任何您的观点 } .onReceive(ble.passThroughSubjectPublisher){中的响应//
    struct ReaderInformations: View {
        var ble: BleConnection
        @State private var status: String = "status" 
    
        var body: some View {
    
           VStack { // .. any your view
    
    
           }
           .onReceive(ble.passThroughSubjectPublisher) { response in // << here !!
                  switch response[0] {
                     self.status = "TEST"
                  ///...
                 }
            }
        }
    }