我有一個使用第三方庫的例子,我想將它變成一個Observable。恰當地說,圖書館是圍繞代表設計的,正如人們期望的那樣,我正在包裝它。庫執行異步操作,並在完成時調用它的代理和結果。如何正確地將第三方庫代理轉換爲RxSwift Observable
我絕對想利用可觀察性的cold
性質,只有在有人訂閱時纔開始操作。我有一個可行的解決方案,我只是不知道它是否存在嚴重缺陷,我錯過了對RxSwift
的一些重要理解,或者可能有更簡單的方法來實現相同的目標。
public final class RxLibBridge: LibDelegate{
let lib = Lib()
let _source = PublishSubject<[LibResult]>()
public init(){
lib.delegate = self
}
public func asObservable() -> Observable<[LibResult]>{
// create a cold observable to start
// the Lib's async operation on subscribe.
return Observable<Void>.create{
observer in
self.lib.startOperation()
// emit and complete
observer.onNext(())
observer.onCompleted()
return Disposables.create()
}
// convert the `Void` observable into an observable from the
// PublishSubject
.flatMapLatest{self._source}
}
// the lib's completion delegate method
public func lib(_ lib: Lib, didFinishWithResult results: [LibResult]) {
// grab the PublishSubject, emit the result and complete
let observer = _source.asObserver()
observer.onNext(results)
observer.onCompleted()
}
}
所以我的問題是:這是一個合適的Rx模式?再次,它的工作原理:
RxLibBridge()
.asObservable()
.subscribe(...)
只是因爲它的工作原理雖然並不意味着我沒有從根本上誤解了這種情況的工作的正確方法。
我知道有在RxSwift的方式來處理這樣的事情:
https://samritchie.net/2016/05/12/rxswift-delegateproxy-with-required-methods/
我試過這種方法,但它看起來像2015年以來即改變了API,在在擴展中添加rx_delegate
方法時,找不到proxyForObject
以上的示例鏈接。
此外,這種方法似乎贊成純粹的Objective-C
[UIKit/AppKit] API。在我試圖關注鏈接的示例中,我編輯了第三方庫的源代碼,使代理方法optional
並將其公開到@objc
。該庫的代表是required
,我寧願不必分叉庫進行修改。
這個蘇答案爲2個以上鍊接提供的更新的API:
https://stackoverflow.com/posts/38326538/edit