do(onNext :)和subscribe(onNext :)之间有什么区别?

beh*_*rad 6 rx-swift

我是RxSwift的新手,我不了解do(onNext:)和之间的区别subscribe(onNext:)

我用谷歌搜索,但是找不到很好的资源来解释这种差异。

Dan*_* T. 10

在冷的可观察链的开始处,有一个函数会生成事件,例如,引发网络请求的函数。

除非预订了Observable,否则将不会调用该生成器函数(默认情况下,每次预订Observable时都会调用该生成器函数。)因此,如果将a添加do(onNext:)到您的Observable 链中,则该函数将不会被调用并且该动作生成事件的事件将不会启动。您必须为此添加一个subscribe(onNext:)

(实际内部结构比上面的描述要复杂一些,但对于此解释来说足够接近。)

  • 是的,您可以将其视为主要作用,而其他副作用则可以考虑。do运算符在您的代码中应该很少见,而订阅是必需的。 (3认同)

小智 6

DO运营商允许你插入的副作用; 也就是说,处理程序做的事情不会以任何方式改变发出的事件。do只会将事件传递给链中的下一个操作符。

使用 do 运算符的方法在这里。

在此处输入图片说明

您可以为任何或所有这些事件提供处理程序。

假设我们有一个从不发出任何东西的 observable。即使它什么都不发出,它仍然是一个可观察的,我们可以订阅它。do操作符允许我们在订阅时做一些事情。因此,当对该 observable 进行订阅时,下面的示例将打印“已订阅”。

如果您愿意,请随意包含任何其他处理程序;它们就像 subscribe 的处理程序一样工作

let observable = Observable<Any>.never()
let disposeBag = DisposeBag()

  observable
    .do(onSubscribe: {
      print("Subscribed")
    })
    .subscribe(
      onNext: { element in
        print(element)
      },
      onCompleted: {
        print("Completed")
      },
      onDisposed: {
        print("Disposed")
      }
    )
    .disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)