パルカワ2

最近はFlutterをやっています

複数のデータソースに同時にアクセスしていい感じにアレしてソレする

  • 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) とかを使うといい気がした。