我正在使用存储库模式。我想实现一种逻辑,如果内部DB中没有值,则返回Api Response的值并将其插入内部DB中。
接收到的内部DB值(单一类型),如果找到则返回最终值,如果找不到,则请求服务器Api,如果将其插入内部DB(完成类型),则返回最终值(单一类型)如果这些进程中的任何一个调用onError,则此逻辑的最终返回值应为onError。
fun getAllStudent(): Single<List<StudentEntity>> =
cache.getAllStudent().onErrorResumeNext { getAllStudentRemote() }
private fun getAllStudentRemote(): Single<List<StudentEntity>> =
remote.getAllMember()
.map { memberData -> memberData.students }
.map { studentList -> studentList.map { student -> studentMapper.mapToEntity(student) } }
.doOnSuccess { studentEntityList -> cache.insertStudents(studentEntityList) }
这就是我尝试过的方法。但是,在插入部分中,由于无法订阅,因此无法插入内部数据库或检测onError。如何实现这种逻辑? ++对不起我的英语不好。
由于需要等待cache.insertStudents()
完成,因此您可以做的一件事是使用flatMap将cache.insertStudents()
链接到流中。
例如:
fun getAllStudent(): Single<List<StudentEntity>> =
cache.getAllStudent().onErrorResumeNext { getAllStudentRemote() }
private fun getAllStudentRemote(): Single<List<StudentEntity>> =
remote.getAllMember()
.map { memberData -> memberData.students }
.map { studentList -> studentList.map { student -> studentMapper.mapToEntity(student) } }
.flatMap { studentEntityList ->
cache.insertStudents(studentEntityList) // Completable
.toSingleDefualt(studentEntityList) // Convert to Single<List<StudentEntity>>
}
还请注意,.do...
运算符是副作用运算符,并且您不应执行任何可能影响流的操作。