如何将多张单曲合二为一

时间:2018-08-08 18:06:11

标签: firebase kotlin google-cloud-firestore reactive-programming rx-java2

我正在使用Firebase Firestore(远程数据库)和Room(Sqlite,本地数据库)开发Android应用。

在此应用中,第一次从Firebase服务器获取数据并将其插入本地数据库。

有多个表,所以我应该为每个表多次调用它。

例如,

  • 怪物表
  • 项目表
  • 技能表
  • 武器表
  • ...

这是firebase函数:

class MonsterDataSource(val mMonsterDao: MonsterDao) {

    private val TAG = MonsterDataSource::class.java.simpleName

    fun sync(): Single<Boolean> {
        return Single.create<Boolean> { emitter ->
            FirebaseFirestore.getInstance().collection(MONSTERS)
                .get()
                .addOnCompleteListener {
                    if (it.isSuccessful) {
                        // Get data from the firebase
                        val monsters = mutableListOf<Monster>()
                        it.result.documents.forEach {
                            monsters.add(it.toObject(Monster::class.java)!!)
                        }

                        // insert data into the local database
                        Observable.fromCallable {
                            mMonsterDao.save(*monsters.toTypedArray()) }
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe {
                                Log.d(TAG, "[MHW][Monster] save done")
                                emitter.onSuccess(true)
                            }
                    } else {
                        emitter.onError(FirestoreGetFailureException())
                    }
                }
        }
    }
}
  • ItemDataSource
  • SkillDataSource
  • WeaponDataSource
  • ...

我不知道如何将这些单曲组合成一个。

fun syncData() {
    val monsterSingle = MonsterDataSource().sync()
    val itemSingle = ItemDataSource().sync()
    val skillSingle = SkillDataSource().sync()
    val weaponSingle = WeaponDataSource().sync()
    ...

    // I want to know when all data are stored in the local database.
}

第一次,该应用程序被锁定以从服务器获取数据。 完成所有数据同步后(从firebase获取,插入本地数据库),我想解锁该应用程序。 但是我不知道如何组合多个Singles并获得“ onComplete”方法。

如果您有其他解决方案,对我会有所帮助。

1 个答案:

答案 0 :(得分:0)

您可以flatMap每个对象。

例如

new MonsterDataSource().sync()
    .flatMap(monsterSingleResult -> ItemDataSource().sync())
    .flatMap(itemSingleResult -> SkillDataSource().sync())
    // more flatMaps
    .subscribe(finalResult -> {
        // done with all the jobs
     });

另一种选择是将它们zip一起

Single.zip(monsterSingle,itemSingle,...,(monsterResult,itemResult,...) -> {
    // final result
})

除非您使用Scheduler,否则它们将被顺序执行。