为Completables的动态列表创建单个onComplete

时间:2017-11-21 00:27:47

标签: android firebase firebase-realtime-database rx-java rx-android

我正在使用this库来使用RxJava包装Firebase事务。我是RxJava的新手,所以这主要是关于如何使用它的问题。

场景PersonLabel之间存在多对多关系。 Person可以包含多个Label个,Label可以提供给PersonPerson个。创建Person时,我必须:

  • 将它们添加到Label s
  • 列表中
  • 更新为其提供的每个Persons,以便查询属于特定标签的所有Label

我有一个List<Label> labels; // Let's assume it's been instantiated and added to 的列表,我想写入我的Firebase数据库。

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference peopleRef = database.getReference().child("people");
DatabaseReference labelsRef = database.getReference().child("labels");
int newPersonId = peopleRef.push().getKey();

我想将这些内容写入数据库:

// Let's assume I already saved the Person to the DB
for (Label label : labels){
    // For each label, index the Person saved (Looks like 'personId: true')
    labelsRef.child(label).child(newPersonId).setValue(true);
}

如果我不关心通话是否成功,我可以轻松地做到这一点。

Label

但如果我关心结果怎么办?如果我想对正在更新的所有Activity做出反应(例如离开当前的Completable),我需要知道它们是否都已成功更新。

实现RxFirebase,以便在DB中设置值返回n。我本质上希望将Label个完整表格压缩在一起,并且只有在成功或失败时才会执行某些操作。

到目前为止,如果我只想更新一个n,我可以这样做,但我想更新Label RxFirebaseDatabase.setValue(peopleRef.child(newPersonId), person) // Save the Person .andThen(RxFirebaseDatabase.setValue(labelsRef.child(label).child(newPersonId), true)) // I can index 1 Label, and this returns a Completable

以下代码段链接2个Completables,但只保存1个标签

startDate.getTime()

我该怎么做?如果您对Firebase了解得足够好,这是保存项目列表的正确方法吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的主要问题,那么您有一个Completable的集合,您需要将它们作为一个订阅。

解决此问题的方法是使用Completable.concatCompletable.merge运算符。

  

可完成。 concat :返回一个Completable,只有当所有来源一个接一个地完成时才会完成。

     

Completable。 merge :返回一次订阅所有源的Completable实例,仅在所有源Completables完成或其中一个发生错误时完成。

示例:

List<Completable> tasks;  // initialized elsewhere

Completable
    .concat(tasks)
    .subscribe(
        () -> Log.d(TAG, "All successful"),
        throwable -> Log.w(TAG, "One or more failed"))

关于你的第二个问题,我不太了解Firebase。

更新:要获得List<Completable>,您可以执行与此类似的操作:

List<Completable> tasks = new ArrayList<>();
for ( ... ) {
    tasks.add(RxFirebaseDatabase.setValue(peopleRef.child(newPersonId), person));
}
Completable.concat(tasks).etc