サードパーティのライブラリを使用している場合があり、オブザーバブルにしたいと考えています。適切に、図書館は代表者の周りに設計されているので、私はそれをラッピングしています。ライブラリは、非同期操作を実行し、完了したらその結果を持つ代理人を呼び出します。サードパーティのライブラリデリゲートを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
に公開するように、第三者libのソースを編集していました。 libの代理人はrequired
です。私はlibを変更して変更する必要はありません。
このSO上記2つのリンクのために更新APIを提供答え:これはRxSwift 3.3.1
のために更新され、必要なデリゲートメソッド、とトリックを行いますのようなので、いくつかのより多くを掘った後、それが見えます
https://stackoverflow.com/posts/38326538/edit