- localSource と remoteSource同時にアクセス。早く返ってきたほうを使う
- 速度関係なくremoteSourceから値が返ってきたらlocalに値を保存したい
- localSourceでエラーが出てもログを吐いて、remoteSourceの値を待ちたい
- 値を使う使わないに関係なく、エラーは起きたらある程度はハンドリングしたい
というのをオペレーターで出来ないものか…?と思って調べてたけど、チームメンバーに「こうやればいいよ」と言われたのがシンプルだった。たしかにな……………
SingleSubject<String> subject = SingleSubject.create(); Single<String> localSource = Single.create(emitter -> { Log.i("TEST", "local"); // emitter.onSuccess("data1"); emitter.onError(new RuntimeException("local error")); }); Single<String> remoteSource = create(emitter -> { Log.i("TEST", "remote"); // emitter.onSuccess("data2"); emitter.onError(new RuntimeException("remote error")); }); localSource.subscribe(string -> { Log.i("TEST", "local source onSuccess"); subject.onNext(string); }, Throwable::printStackTrace); remoteSource.subscribe(string -> { Log.i("TEST", "remote source onSuccess"); subject.onNext(string); // local に保存 }, subject::onError); subject.subscribe(string -> Log.i("TEST", string), Throwable::printStackTrace);
追記:
SingleSubjectだとonSuccessのあとにonErrorがくるとエラーになるので、PublishSubjectなどにしてtake(1)
とかを使うといい気がした。