【问题标题】:Why calling Completable method inside of flatMap does not working?为什么在 flatMap 中调用 Completable 方法不起作用?
【发布时间】:2021-03-12 15:19:36
【问题描述】:
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() -> 可完成,但不返回任何内容。

我希望当这个 todoUseCase.add 被调用时,调用 subscribe 的 onCompleted 闭包。

我试图对此进行调查

  • 调试#1 完成后返回

  • 调试#2 什么都不返回

我有一个问题,在 flatMap 方法内部调用返回的 Completable 方法是错误的?

【问题讨论】:

    标签: swift rx-swift rx-cocoa


    【解决方案1】:

    在所有订阅的 Observable 完成之前,flatMap 不会完成。在这种情况下,这意味着 requestCreateTodoRelay 和闭包创建的每个 Observable 都必须在 flatMap 发出完成事件之前完成。

    当你考虑到一旦从 flatMap 返回的 Observable 发出一个完整的,它就不允许发出任何其他事件是有道理的。因此,当requestCreateTodoRelay 发出另一个 next 事件时,它将无法正确反应。

    解决方案是让.add(title:description:) 返回一个Single<Void>(或一个同时发出下一个事件和一个已完成事件的Observable<Void>

    顺便说一句,这是一般规则。如果一个 observable 正在响应多个上游 observable,如果任何一个上游 observable 发出错误,它将发出错误,但不会发出已完成的事件,除非所有上游 observable 都这样做。

    【讨论】:

    • 非常感谢,我误解了 flatMap 返回只是在 flatMap 的返回中。
    • 你应该认为完成事件的存在只是为了让下游的 Observables 知道他们可以释放他们的资源,因为不会有更多的事件发生。这就是它的唯一目的。它不会通知观察者其他任何事情。
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2014-01-09
    相关资源
    最近更新 更多