【问题标题】:How to pass data from delegate method to the observable's onNext method in RxSwift?如何将数据从委托方法传递到 RxSwift 中可观察的 onNext 方法?
【发布时间】:2020-01-22 20:21:38
【问题描述】:

我有一个管理器类,它将连接和管理蓝牙设备的数据和状态。

管理器类符合 IWDeviceManagerDelegate 并且有一个方法可以提供权重数据func onReceiveWeightData(_ device: IWDevice!, data: IWWeightData!)

一旦我从任何控制器调用listenToWeight(),我想使用 Observable 提供数据。

如何使用onReceiveWeightData 方法的数据触发 onNext 事件到listenToWeight observable?

下面是代码。

class WeightMachineManager: NSObject {

    func setup() {
        IWDeviceManager.shared()?.delegate = self
        IWDeviceManager.shared()?.initMgr()
    }

    func listenToWeight() -> Observable<IWWeightData> {
        let tag = WeightMachineManager.tag
        if let connectedDevice = connectedDevice {
            IWDeviceManager.shared()?.add(connectedDevice, callback: { (device, code) in
                if code == .success {
                    print("\(tag)[SUCCESS] Device added successfully.")
                } else {
                    print("\(tag)[FAILURE] Failed to add device.")
                }
            })
        } else {
            print("\(tag)[FAILURE] Couldn't find any device to connect.")
        }
    }
}

extension WeightMachineManager: IWDeviceManagerDelegate {
    func onReceiveWeightData(_ device: IWDevice!, data: IWWeightData!) {
        // TODO:- Pass this data in the onNext event of listenToWeight's observable.
    }
}

【问题讨论】:

  • 什么是ICDeviceManager?什么是IWDeviceManagerDelegate?它们是否以某种方式相互关联?你的 listenToWeight() 永远不会返回任何东西。
  • @DanielT。是的,它们彼此相关。 IWDeviceManager 连接到硬件的经理。 IWDeviceManagerDelegate 是协议。该协议具有返回重量数据的方法。我不知道在listenToWeight() 方法中返回什么,因为我只分配必须测量重量的设备。 devices sdk 在IWDeviceManagerDelegate's 方法中返回权重。
  • 答案可以在这里找到:stackoverflow.com/questions/51816144/…
  • 感谢您的帖子,如果您不介意可以在我的代码中显示这个吗????

标签: swift observable rx-swift reactive


【解决方案1】:

我在下面做了很多假设,但结果应该是这样的:

class WeightMachineManager {

    var connectedDevice: IWDevice?

    func setup() {
        IWDeviceManager.shared()?.initMgr()
    }

    func listenToWeight() -> Observable<IWWeightData> {
        if let connectedDevice = connectedDevice, let deviceManager = IWDeviceManager.shared() {
            return deviceManager.rx.add(connectedDevice)
                .flatMap { deviceManager.rx.receivedWeightData() } // maybe this should be flatMapLatest or flatMapFirst. It depends on what is calling listenToWeight() and when.
        }
        else {
            return .error(NSError.init(domain: "WeightMachineManager", code: -1, userInfo: nil))
        }
    }
}

extension IWDeviceManager: HasDelegate {
    public typealias Delegate = IWDeviceManagerDelegate
}

class IWDeviceManagerDelegateProxy
    : DelegateProxy<IWDeviceManager, IWDeviceManagerDelegate>
    , DelegateProxyType
    , IWDeviceManagerDelegate {

    init(parentObject: IWDeviceManager) {
        super.init(parentObject: parentObject, delegateProxy: IWDeviceManagerDelegateProxy.self)
    }

    public static func registerKnownImplementations() {
        self.register { IWDeviceManagerDelegateProxy(parentObject: $0) }
    }
}

extension Reactive where Base: IWDeviceManager {

    var delegate: IWDeviceManagerDelegateProxy {
        return IWDeviceManagerDelegateProxy.proxy(for: base)
    }

    func add(_ device: IWDevice) -> Observable<Void> {
        return Observable.create { observer in
            self.base.add(device, callback: { device, code in
                if code == .success {
                    observer.onNext(())
                    observer.onCompleted()
                }
                else {
                    observer.onError(NSError.init(domain: "IWDeviceManager", code: -1, userInfo: nil))
                }
            })
            return Disposables.create()
        }
    }

    func receivedWeightData() -> Observable<IWWeightData> {
        return delegate.methodInvoked(#selector(IWDeviceManagerDelegate.onReceiveWeightData(_:data:)))
            .map { $0[1] as! IWWeightData }
    }
}

【讨论】:

  • 非常感谢。你是反应式编程的专家。
  • extension IWDeviceManager: HasDelegate 要求在其中添加 var delegate: Delegate? { get set }。我想你还没有在那里添加它。
  • 在您的问题中,您致电.delegate = self。这告诉我 var 已经存在。
  • 不抱歉没有,我该怎么办?
  • 是的,你做到了:IWDeviceManager.shared()?.delegate = self。也就是说,要解决这个问题,您需要为委托实现 { get set} 并获取和设置委托。
猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多