gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:12:13 28 4
gpt4 key购买 nike

我有一个与小型 BLE 设备通信的快速应用程序。我能够发送请求并从设备获取答案,但我很难更新我的 swiftui View 上显示的值。

这是我尝试过的:

  • 带有回调:

  • 在 BleConnection.swift 文件中,实现了所有 BLE 的东西,我声明了一个回调 var onResponse: (([UInt8]) -> Void)? = nil当从设备接收到响应时,数据会通过回调推送到 View :
        func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    ...
    if self.onResponse != nil {
    self.onResponse!(characteristic.value!.bytes)
    }
    }
    }
    }

    在有 swiftui View 的 ReaderInformations.swift 文件中,我实现了回调并尝试使用 @State var 更新组件显示值但它没有成功。回调中的 print() 在控制台中打印得很好,但组件没有更新。然后我读到只有 View 的内部方法可以更新状态变量。
  • 结合:
    我更新了外围设备(didUpdateValueFor)并发送了 BLE 设备响应,如下所示:
  • let passThroughSubjectPublisher = PassthroughSubject<[UInt8], Never>()

    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    ...
    passThroughSubjectPublisher.send(characteristic.value!.bytes)
    }
    }

    在 View 中:
    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)
    }

    我也不工作,因为我尝试在 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"
    ///...
    }
    }
    }
    }

    关于ios - SwiftUI:如何处理 BLE 响应并显示新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62002405/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com