将热观察变为冷可观察

时间:2015-12-01 21:45:31

标签: rx-java

我用RxJava观察数据库表。所有SQL SELECT查询都返回一个热的observable,每当我在同一个表中INSERT / UPDATE / DELETE行时,我将重新运行任何订阅的SELECT查询并在热查询observable上调用onNext(queryResult)

database.select("SELECT * FROM Foo) // returns an observable
       .map(doSomething)
       .filter(aFilter)
       .subscribe (
             { 
                 //  onNext
             },
             {
                // onError
             }
          )

这很有效。但是,在一个特殊用例中,我想避免数据库重新发出新项目。是否有某种操作员可以使用它来使它成为一个“冷”的#34; observable,而不必更改我为这样的热观察器构建的所有数据库层:

database.select("SELECT * FROM Foo) // returns an observable
           .map(doSomething)
           .filter(aFilter)
           .toColdObservable()
           .subscribe (
                 { 
                     //  onNext
                 },
                 {
                    // onError
                 }
              )

我知道"冷可观察"这不是正确的词,但我找不到更好的名字。所以我想要的是数据库不会通知SQL Query Observable更新。所以我的意思是"冷可观察"只是一次查询数据库,之后再也没有收到更新。

3 个答案:

答案 0 :(得分:4)

简单take(1)怎么样?这将在第一次结果后完成您的查询可观察。

答案 1 :(得分:1)

如果您不想要通知,可以使用空subscribe,这会有效地忽略结果:

  

订阅Observable但忽略其排放和通知。

database.select("SELECT * FROM Foo") // returns an observable
           .map(doSomething)
           .filter(aFilter)
           .subscribe ()

答案 2 :(得分:1)

有两种主要方法可以将热点可观察量转换为冷点:defer完全推迟存在或replay + autoConnect(0)预先运行它并只重放给其他人冷酷的。

但是,此select的通知方案意味着它不会完成,因此您需要应用某种timeout,以便重播的大小有限。

我还会检查库是否实际上支持一次性运行(冷)查询,而你没有这个问题;每个订阅者将运行一个新的有限查询。否则,这可能是一个不错的功能请求。