【问题标题】:Rxjava fetch data from server and update cache when cache is accessedRxjava 从服务器获取数据并在访问缓存时更新缓存
【发布时间】:2021-09-08 03:19:51
【问题描述】:

我有一个用例,我需要从缓存中获取数据,然后使用来自服务器的数据更新缓存。这样,当我下次访问缓存时,它将获得更新的数据。

我尝试使用 concat() 和 merge() 运算符来组合缓存和网络调用,但在客户端我只需要第一个值一旦发出缓存值,网络调用 observable 就会被释放。

下面是我正在使用的代码,有没有更好的方法来实现这一点。目前我正在使用 doOnSuccess 方法进行订阅,这不是正确的方法。

class DataKit{
    
    var cachedData: Data? = null
    
    fun getData(): Single<Data> {
     return if(cachedData != null){
             Single.just(cachedData)
                  .doOnSuccess {
                     getPinInfo()
                     .subscribeOn(schedulerProvider.io())
                     .subscribeBy(defaultErrorFun)
                   }
        }else getPinInfo()
    }
    
    
    fun getPinInfo():Single<Data>{
         api.getDataFromServer()
         .doOnSuccess{ cachedData = it}
         .doOnError{cachedData = null}
    }

【问题讨论】:

    标签: android kotlin rx-java reactive-programming


    【解决方案1】:

    我相信你可以在没有 if/else 条件的情况下将它写成 2 行作为一个序列:

       fun getData(): Single<Data> {
           return Maybe.fromOptional(Optional.ofNullable(cachedData))
                .switchIfEmpty(getPinInfo)
    }
    

    如果您还需要在缓存存在的情况下进行服务器调用,您可以使用flatMapSingle 运算符:

     .flatMapSingle{ getPinInfo }
    

    但我不确定这是否有意义,我的意思是发出额外的请求只是为了更新缓存值。

    如果您需要获取缓存值,然后使用从服务器接收到的值更新它,可以使用Flowable

    【讨论】:

    • flatMapSingle{ getPinInfo } 在这里无济于事,因为它会增加响应时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2017-07-06
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多