簡體   English   中英

iOS RxSwift 4.2如何使用DelegateProxy實現CBCentralManager的反應性擴展?

[英]iOS RxSwift 4.2 how to implement Reactive extension of CBCentralManager using DelegateProxy?

我正在看這個在Core Bluetooth中使用反應式擴展的示例 但是,它是用swift 3.0編寫的,在Swift 4.2中運行時有很多錯誤。 我對實現CBCentralManager的反應式擴展以向我提供狀態事件的RX流感興趣。

我的理解是,這允許代理從CBCentralManager接收委托事件,並使用_stateBehaviorSubject: BehaviorSubject<CBManagerState>?將它們傳播給觀察者_stateBehaviorSubject: BehaviorSubject<CBManagerState>? 但是,該項目有太多錯誤,我無法弄清楚要保留僅所需功能的情況。

如何使用CBCentralManager的DelegateProxy實現反應式擴展?

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)
  }
}

這是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)
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM