ios - Rx swift : Why does flatMapLatest never execute onCompleted()?

标签 ios swift rx-swift reactivex rx-cocoa

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

我的类(class)成员定义为:

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 运算符不会发出您在 block 内返回的任何可观察对象的完成事件。

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

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

事实上,Variable 仅在释放时发出完成。参见 source v4.0 . 请注意,Variable 在 RxSwift 4 中已被弃用,我们鼓励您改用 RxCocoa 的类似 BehaviorRelay

deinit {
    _subject.on(.completed)
}

关于ios - Rx swift : Why does flatMapLatest never execute onCompleted()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773918/

相关文章:

ios - 一张带有 alpha 滞后 spritekit 的图像

ios - 当我尝试选择路由 : pedestrians in Capabilities > Maps 时 Xcode 崩溃

ios - RxSwift 仅在附加新元素时观察数组变化

c# - 使用密码锁定 iPhone 设备

ios - 如何为自动续订订阅 (iOS) 授予免费月份?

objective-c - 使用 Delegate 监听变化 - 核心数据

ios - 如何使用 UICollectionView 在单元格左侧创建部分和标题?

ios - 无法在 UIStoryBoard segue 中传递值

ios - 我们如何通过 distinctuntilChange 只允许 2 个不同的项目来过滤 Observable

ios - 如何动画从 TableView (rxswift)中删除单元格?