我需要一些关于异步任务和Firebase的帮助。我需要在Firebase实时数据库中保存n个itens,但我不知道如何处理回调。
这是我的代码:
TagRepository tagRepository = new TagRepository();
for (Tag tag : databaseTags){
if (user.getTags().containsKey(tag.getId())){
Completable completable = tagRepository.saveUserOnTag(String.valueOf(tag.getId()), user.getUid());
}else{
tagRepository.removeUserOnTag(String.valueOf(tag.getId()), user.getUid());
}
}
public Completable saveUserOnTag(String idTag, String userUid) {
return io.reactivex.Completable.create(emitter->{
reference.child(idTag).child("users/").child(userUid).setValue(true).addOnCompleteListener(task -> emitter.onComplete());
});
}
如果我在此方法上使用回调,回调将被调用 n 次,因此我不知道如何知道何时所有这些都已保存以便我可以继续。
正如您在该方法上看到的那样,我正在尝试使用 Completable 进行一些操作,但我真的不知道如何处理它。有什么简单的方法可以同时保存所有数据或控制正在保存的所有数据?
根据官方文档,您可以使用同时更新。
使用这些路径,您可以通过对
updateChildren()
的单个调用对 JSON 树中的多个位置同时执行更新。以这种方式进行的同时更新是原子的:要么所有更新成功,要么所有更新都失败。
您可以尝试使用 Tasks.await
同步更新 Firebase 数据
更改saveUserOnTag
方法,如下所示并尝试
public Completable saveUserOnTag (String idTag, String userUid){
return io.reactivex.Completable.create(emitter -> {
Tasks.await(reference.child(idTag).child("users/").child(userUid).setValue(true));
emitter.onComplete();
});
抱歉,我不知道 Rx,但这是一种在一次 API 调用中插入所有数据的方法。onComplete()
方法是更新完成回调。
Map<String, Object> values = new HashMap<>();
for (Tag tag : databaseTags){
if (user.getTags().containsKey(tag.getId())){
values.put(idTag + "/users/" + userUid, true);
}else{
tagRepository.removeUserOnTag(String.valueOf(tag.getId()), user.getUid());
}
}
reference.updateChildren(values, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
// all data saved, do next action
}
});
希望这对:)有所帮助