我有以下用例:
onComlete()
我有一个实体列表。每个实体都附加了0..n个文件。如果上传了实体的所有文件,我想上传每个文件并将其存储为成功。
目前我这样做:
Observable.fromIterable(entities)
.flatMap(entity -> {
//create a list of executable observables
List<Observable> tasks = new ArrayList<>();
// get all files of the entity
List<File> files = entity.getFiles();
// iterate through all files and upload the file. If successful -> store entity
files.forEach(file -> tasks.add(uploadImage(file)
.doOnComplete(() -> {
entity.update(entity.setUploaeded(true));
repository.store(entity);
})
));
这是我的whenAll
方法:
private Observable whenAll(List<Observable> tasks) {
return Observable.fromIterable(tasks)
.flatMap(task -> task.observeOn(Schedulers.computation()));
}
我想删除辅助方法whenAll
。这可能吗?以下是它的样子:
Observable.fromIterable(entities)
.flatMapIterable(entity -> {
List<File> files = entity.getFiles();
return files;
})
.flatMap(file -> uploadImage(file))
.doOnComplete(() -> {
// TODO: update entity and store it
});
答案 0 :(得分:1)
您提供的潜在解决方案并非完全可能,因为当您将实体映射到文件时,您将丢失有关下游实体的信息。
由于您已将此标记为RxJava2,因此我将使用Completables。我假设uploadImage(file)
方法返回Complete(如果不能,则可以轻松转换它)。您的问题的解决方案可能如下所示:
Observable.fromIterable(entities)
.flatMapCompletable(entity->
Observable.fromIterable(entity.getFiles())
.flatMapCompletable(this::uploadImage)
.doOnComplete(() ->{
entity.update(entity.setUploaeded(true));
repository.store(entity);
}).subscribeOn(Schedulers.computation()))
因此,您还将获得Completable。我在这里做的是:
我没有机会测试这个解决方案,因为我现在无法打开AndroidStudio。如果有帮助或是否需要进行一些更改,请告诉我。