我是RxJava的新手,我试图将它与Repository模式一起使用(通过Clean Architecture)。这是我的存储库界面:
public interface IRepository<T extends IEntity> {
Completable add(T entity);
Completable add(List<T> entities);
Completable remove(T entity);
Completable remove(List<T> entities);
Single<T> get() throws IOException;
Single<List<T>> getMany() throws IOException;
}
IEntity是简单的界面,可以统一我的模型类,它的实现并不重要。
这是我的存储库的实现:
public class WarehouseRepository extends Repository<Warehouse> {
public WarehouseRepository(ILocalDataSource<Warehouse> localDataSource,
IRemoteDataSource<Warehouse> remoteDataSource) {
//Some unnecessary code
}
//Some unnecessary code
@Override
public Single<List<Warehouse>> getMany() throws IOException {
Single<List<Warehouse>> local = mLocalDataSource.getMany(mLocalSpecification);
Single<List<Warehouse>> remote = mRemoteDataSource.getMany(mRemoteSpecification).doOnSuccess(this::add);
return Single.concat(local,remote).filter(warehouses -> !warehouses.isEmpty()).firstElement().toSingle();
}
@Override
public Completable add(List<Warehouse> warehouses) {
return mLocalDataSource.add(warehouses);
}
}
我想要做的是在一个数据流中统一两个数据源,即当我在本地数据源中没有数据时,我想要请求API,当我通过remoteDataSource从API成功获取数据时,我希望自动将数据保存到db。出于这些目的,我使用.concat
.filter
和.firstElement()
,因此第一个问题将是:
这是实现目标的好方法吗?
我发现的另一个问题是Completable add(List<Warehouse> warehouses)
方法永远不会调用因为我需要订阅这个可填充的才能使它工作。所以我改变了
mRemoteDataSource.getMany(mRemoteSpecification).doOnSuccess(this::add);
到
mRemoteDataSource.getMany(mRemoteSpecification).doOnSuccess(warehouses -> {add(warehouses).subscribe();});
但是缺乏这样的解决方案是不可能处理doOnSucess()中可能发生的异常,所以第二个问题是:
如何处理doOnSucess中发生的异常/或者有其他选择吗?