[英]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.