在我的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
运算符不会发出您在块内返回的任何可观察到的已完成事件。
以下代码清楚地说明了这一点。 .just(_)
发出元素,然后发出完成事件,该事件不会终止订阅。
_ = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.debug("before flatmap")
.flatMap { .just($0 * 2) }
.debug("after flatmap")
.subscribe()
实际上,
Variable
仅在释放后才发出完成。参见source v4.0。请注意,RxSwift 4中不推荐使用Variable,建议您改用RxCocoa的类似
BehaviorRelay
。deinit {
_subject.on(.completed)
}