为什么在 flatMap 中调用 Completable 方法不起作用?
Why calling Completable method inside of flatMap does not working?
protocol TodoUseCase {
func add(title: String, description: String) -> Completable
}
final class CreateTodoPresenterImpl: CreateTodoPresenter {
var todoUseCase: TodoUseCase!
var bag = DisposeBag()
func setBind() {
requestCreateTodoRelay
.flatMap { [weak self] _ -> Completable in
guard let weakSelf = self else { return Completable.empty() }
return weakSelf.todoUseCase.add(title: weakSelf.titleInputtedText.value, description: weakSelf.descriptionInputtedText.value)
.debug() // debug#1
}
.debug() // debug#2
.subscribe(onError: { [weak self] error in
self?._showAPIErrorPopupRelay.accept(error)
}, onCompleted: { [weak self] in
self?.toLoginView()
})
.disposed(by: bag)
}
}
为什么这个函数 todoUseCase.add() -> 可完成,但 return 什么都不做。
我希望在这个 todoUseCase.add 调用时,调用订阅的 onCompleted 闭包。
我试图对此进行调查
调试#1
return onCompleted
调试#2
return没什么
我有一个问题,在flatMap方法里面调用returning Completable方法是错误的吗?
A flatMap
在所有订阅的 Observable 完成之前不会完成。在这种情况下,这意味着 requestCreateTodoRelay
和闭包创建的每个 Observable 都必须在 flatMap 发出完成事件之前完成。
当您考虑到一旦从 flatMap 编辑的 Observable return 发出一个完整的事件,就不允许发出任何其他事件时,这是有道理的。因此,当 requestCreateTodoRelay
发出另一个下一个事件时,它无法做出正确反应。
解决方案是 .add(title:description:)
return Single<Void>
(或 Observable<Void>
同时发出下一个事件和完成的事件。
顺便说一句,这是一般规则。如果一个 observable 正在响应多个上游 observable,如果任何一个上游 observable 发出错误,它将发出一个错误,但不会发出一个完成的事件,除非所有上游 observable 都这样做。
protocol TodoUseCase {
func add(title: String, description: String) -> Completable
}
final class CreateTodoPresenterImpl: CreateTodoPresenter {
var todoUseCase: TodoUseCase!
var bag = DisposeBag()
func setBind() {
requestCreateTodoRelay
.flatMap { [weak self] _ -> Completable in
guard let weakSelf = self else { return Completable.empty() }
return weakSelf.todoUseCase.add(title: weakSelf.titleInputtedText.value, description: weakSelf.descriptionInputtedText.value)
.debug() // debug#1
}
.debug() // debug#2
.subscribe(onError: { [weak self] error in
self?._showAPIErrorPopupRelay.accept(error)
}, onCompleted: { [weak self] in
self?.toLoginView()
})
.disposed(by: bag)
}
}
为什么这个函数 todoUseCase.add() -> 可完成,但 return 什么都不做。
我希望在这个 todoUseCase.add 调用时,调用订阅的 onCompleted 闭包。
我试图对此进行调查
调试#1 return onCompleted
调试#2 return没什么
我有一个问题,在flatMap方法里面调用returning Completable方法是错误的吗?
A flatMap
在所有订阅的 Observable 完成之前不会完成。在这种情况下,这意味着 requestCreateTodoRelay
和闭包创建的每个 Observable 都必须在 flatMap 发出完成事件之前完成。
当您考虑到一旦从 flatMap 编辑的 Observable return 发出一个完整的事件,就不允许发出任何其他事件时,这是有道理的。因此,当 requestCreateTodoRelay
发出另一个下一个事件时,它无法做出正确反应。
解决方案是 .add(title:description:)
return Single<Void>
(或 Observable<Void>
同时发出下一个事件和完成的事件。
顺便说一句,这是一般规则。如果一个 observable 正在响应多个上游 observable,如果任何一个上游 observable 发出错误,它将发出一个错误,但不会发出一个完成的事件,除非所有上游 observable 都这样做。