iOS RxSwift 4.2, как реализовать Реактивное расширение CBCentralManager с использованием DelegateProxy?
Я смотрю на этот пример использования реактивных расширений с 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 ответ
Решение
Это рабочая реализация для 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)
}
}