繁体   English   中英

RxSwift:为什么flatMapLatest从不执行onCompleted()?

[英]RxSwift: Why does flatMapLatest never execute onCompleted()?

在我的Swift UIViewController中,我尝试订阅变量类型的类成员,通过flatMapLatest调用运行它,然后在所有订阅者上执行flatMapLatest可观察到的onCompleted()调用。 但是,虽然调用了onNext(),但是onCompleted()从来没有,而且我不确定为什么。

我的班级成员定义为:

private let privateVar = Variable<String>("")

在我的viewDidLoad()方法中,我设置了可观察对象:

let localVar = self.privateVar.asObservable().distinctUntilChanged()

localVar.subscribe(onNext: { [weak self] sent in print("first onNext called") })
        .disposed(by: self.disposeBag)

let mappedVar = localVar.flatMapLatest { self.ajaxLoad(var1: $0) }.share()

mappedVar.subscribe(
  onNext: { [weak self] queryRes in
    print("onNext called!")
  },
  onCompleted: { [weak self] in
    print("onCompleted called!")
  }
)
.disposed(by: self.disposeBag)

和我的ajaxLoad方法:

func ajaxLoad(var1 myVar: String) -> Observable<QueryResponse> {
  return Observable.create { observable in
    apollo.fetch(query: MyQuery()) { (result, _) in
      observable.onNext(result?.data?.myQuery)
      observable.onCompleted()
    }

    return Disposables.create()
  }
}

我对ReactiveX还是很陌生,所以我可能对Rx生命周期的实际情况有些困惑。 为什么可以在flatMapLatest调用中调用onNext而不在onCompleted上调用? 任何帮助,将不胜感激。 提前致谢!

flatMap运算符不会发出您在块内返回的任何可观察到的已完成事件。

以下代码清楚地说明了这一点。 .just(_)发出元素,然后发出完成事件,该事件不会终止订阅。

_ = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    .debug("before flatmap")
    .flatMap { .just($0 * 2) }
    .debug("after flatmap")
    .subscribe()

实际上, Variable仅在释放后才发出完成。 参见源v4.0 请注意,RxSwift 4中不推荐使用Variable,建议您改用RxCocoa的类似BehaviorRelay

deinit {
    _subject.on(.completed)
}

因为您说过自己很新,而且有点“朦胧” ...

请记住,只要localVar发生更改,它就会发出一个新值并ajaxLoad(var1:) 然后, ajaxLoad(var1:)的结果将被推送到您的订阅的onNext闭包中。

还要记住,如果一个Observable发出一个.completed它就死了。 它不再发出其他任何东西。

所以flatMapLatest 无法完成(除非其源完成),如果有,它会杀死整个管道并没有更多的变化localVar会得到通过管道传送, ajaxLoad(var:1)将不会再次获得与被叫新值,仅此而已将其推入订阅的onNext方法。

可以将一系列可观察到的东西想像成一台Rube Goldberg机器,其中一个completed的机器会关闭它,而error会破坏它。 您唯一应关闭机器的时间是 (在本例中为localVar )完成发射值或接收 (目标在本例中为onNext:闭合)不再需要更多值时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM