代码之家  ›  专栏  ›  技术社区  ›  Alex Stone

iOS RXSwift 4.2如何使用DelegateProxy实现cCentralManager的响应式扩展?

  •  1
  • Alex Stone  · 技术社区  · 6 年前

    我在看 this example of using reactive extensions with Core Bluetooth . 但是,它是用swift 3.0编写的,并且在swift 4.2中有许多错误。我对实现 CBCentralManager 为我提供状态事件的Rx流。

    我的理解是,这允许代理从cbCentralManager接收委托事件,并使用 _stateBehaviorSubject: BehaviorSubject<CBManagerState>? 但是,这个项目有太多的错误,我无法确定应该从何处切入,只保留我想要的功能。

    如何使用DelegateProxy for CBCentralManager实现响应式扩展?

    extension Reactive where Base: CBCentralManager {
    
      public var delegate: DelegateProxy {
        return RxCBCentralManagerDelegateProxy.proxyForObject(base)
      }
    
      public var state: Observable<CBManagerState> {
        let proxy = RxCBCentralManagerDelegateProxy.proxyForObject(base) //error here
        return proxy.stateBehaviorSubject.skip(1)
      }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Jans    6 年前

    这是用于 CBCentralManager

    extension CBCentralManager : HasDelegate {
        public typealias Delegate = CBCentralManagerDelegate
    }
    
    class RxCBCentralManagerDelegateProxy
      : DelegateProxy<CBCentralManager, CBCentralManagerDelegate>
      , DelegateProxyType
      , CBCentralManagerDelegate
    {
    
       internal let stateBehaviorSubject: BehaviorSubject<CBManagerState>
    
       init(centralManager: CBCentralManager) {
           let subject = BehaviorSubject(value: centralManager.state)
           stateBehaviorSubject = subject
    
           super.init(parentObject: centralManager, delegateProxy: RxCBCentralManagerDelegateProxy.self)
       }
    
       func centralManagerDidUpdateState(_ central: CBCentralManager) {
           stateBehaviorSubject.onNext(central.state)
           _forwardToDelegate?.centralManagerDidUpdateState(central)
       }
    
       static func registerKnownImplementations() {
           self.register { RxCBCentralManagerDelegateProxy(centralManager: $0) }
       }
    
       deinit {
           stateBehaviorSubject.on(.completed)
       }
    }
    
    extension Reactive where Base : CBCentralManager {
       var delegate: DelegateProxy<CBCentralManager, CBCentralManagerDelegate> {
           return RxCBCentralManagerDelegateProxy.proxy(for: base)
       }
    
       var state: ControlEvent<CBManagerState> {
           let source = (delegate as! RxCBCentralManagerDelegateProxy)
              .stateBehaviorSubject
              .skip(1)
           return ControlEvent(events: source)
       }
    }