如何使用switchIfEmpty?

时间:2017-08-07 14:50:38

标签: android rx-java rx-java2

我需要从DB获取数据。如果它为空,则从服务器获取数据并将其插入数据库。 这是我的代码,

public Flowable<List<Data>> test() {
    return dataDao.allDatas()
           .switchIfEmpty(datas())
                .doOnNext(datas -> userStoreDao.insert(datas))
           );
}

public Flowable<List<Data>> datas() {
    return Flowable.zip(userFavoriteDatas(), userOtherDatas(),
        (favoriteDatas, otherDatas) -> {
            favoriteDatas.addAll(otherDatas);
            return favoriteDatas;
        });
}

public Flowable<List<Data>> userFavoriteDatas() {
    return userDatas()
        .map(UserDatas::favoriteDatas)
        .flatMapIterable(datas-> datas)
        .map(aLong -> new UserData(aLong, 1))
        .toList()
        .toFlowable();
}

public Flowable<List<Data>> userOtherDatas() {
    return userDatas()
        .map(UserDatas::otherDatas)
        .flatMapIterable(datas-> datas)
        .map(aLong -> new UserData(aLong, 1))
        .toList()
        .toFlowable();
}

private Flowable<Datas> userDatas() {
    return api
        .userDatas()
        .toFlowable()
        .share(); 
}

@GET("user/datas")
Single<Datas> datas();

当第一部分返回空结果时它到达第二部分。 datas()直到最后都没有到达,而我只运行它工作的第二部分但是与switchIfEmpty()结合它到达userDatas()并且没有完成

我也尝试了concat(),结果相同。

1 个答案:

答案 0 :(得分:1)

(来自评论):

如果您使用toList,则需要有限的流。根据OP的反馈,allDatas来源无限但返回空List。该决议至少应用take(1)来获得allDatasList的一个答案 然后有选择地过滤掉空switchIfEmpty,以便return allDatas.take(1).filter(list -> !list.isEmpty()) .switchIfEmpty(datas()) .doOnNext(datas -> userStoreDao.insert(datas)); 切换到替代方案:

PM> $PSVersionTable.PSVersion

 Major  Minor  Build  Revision
 -----  -----  -----  -------- 
 2      0      -1     -1