1

挑战:我希望有一个存储库来生成查询(Query<T>),调用者可以为其指定调度程序,并以任何它想要的方式进行操作,这反过来也自动更新,因为更改事件通过总线在内部传播(PublishSubject,除非有更好的方法?让我知道)。

调度程序来自调用者,而不是直接从存储库“继承”,这一点很重要;因为某些查询将被合并,因此不能来自不同的线程。基本上,我希望能够为整个 observable 链指定调度程序,并有可能在其中有多个查询 observables。

一般来说 - 这很好用......但是一旦将更改事件引入图片中,事情就会变得非常混乱,非常快。据我了解,这是因为主题将在与调用者相同的线程上传播其事件。这导致Query<T>上述根据调用的位置在不同的调度程序上执行其工作,这subject.onNext(..)就是挑战。

如何通过 PublishSubject 强制 ChangeEvents 在Observable<Query<T>>与其创建的调度程序相同的调度程序上进行观察?没有明确指定 .observeOn()?

我对挑战的不同方法持开放态度,但从我的实验来看,这似乎是“正确”的方法。如果还有其他方法可以解决,请赐教。

interface Query<T>{
    T findFirst();
}

Repository repo = new Repository();

repo.createQuery(IceCream.class) //Returns Observable<Query<IceCream>>
    .map(it.findFirst())         //Returns IceCream
    .map(it -> it.getName())     //Returns "Magnum Choco"
    .subscribeOn(Schedulers.computation())
    .unsubscribeOn(Schedulers.computation())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(it -> Timber.d("Got IceCream with name: %s",it))

我感谢您的智慧和帮助。对冰淇淋的渴望感到抱歉。

4

0 回答 0