为什么在 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 闭包。

我试图对此进行调查

我有一个问题,在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 都这样做。