iOS RxSwift 4.2, как реализовать Реактивное расширение CBCentralManager с использованием DelegateProxy? - PullRequest
0 голосов
/ 11 сентября 2018

Я смотрю на этот пример использования реактивных расширений с Core Bluetooth . Тем не менее, он написан на Swift 3.0 и имеет ряд ошибок, работающих в Swift 4.2. Я заинтересован в реализации реактивного расширения CBCentralManager, чтобы предоставить мне поток событий RX.

Насколько я понимаю, это позволяет прокси-серверу получать события делегатов из CBCentralManager и распространять их среди наблюдателей, используя _stateBehaviorSubject: BehaviorSubject<CBManagerState>? Однако в проекте слишком много ошибок, и я не могу понять, где я могу сократить, чтобы сохранить только те функции, которые я хочу.

Как реализовать реактивное расширение, используя DelegateProxy для 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 Ответ

0 голосов
/ 11 сентября 2018

Это рабочая реализация для 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)
   }
}
...