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

Ios RxSwift:为什么flatMapLatest从不执行onCompleted()?,ios,swift,rx-swift,reactivex,rx-cocoa,Ios,Swift,Rx Swift,Reactivex,Rx Cocoa,在我的Swift UIViewController中,我试图订阅一个类型为Variable的类成员,通过flatMapLatest调用运行它,然后在所有订阅服务器上执行flatMapLatest observable中的onCompleted()调用。然而,尽管调用了onNext(),但onCompleted()永远不会被调用,我不知道为什么 我的班级成员定义为: private let privateVar = Variable<String>("") 以及我的ajaxLoad方

在我的Swift UIViewController中,我试图订阅一个类型为Variable的类成员,通过flatMapLatest调用运行它,然后在所有订阅服务器上执行flatMapLatest observable中的onCompleted()调用。然而,尽管调用了onNext(),但onCompleted()永远不会被调用,我不知道为什么

我的班级成员定义为:

private let privateVar = Variable<String>("")
以及我的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()
  }
}
func ajaxLoad(var1 myVar:String)->可观察{
return Observable.create{Observable in
apollo.fetch(query:MyQuery()){(result,_)in
observable.onNext(结果?.data?.myQuery)
可观察的。未完成的()
}
返回一次性物品。创建()
}
}

我对ReactiveX还比较陌生,所以我可能对Rx生命周期的实际情况有点模糊。为什么在flatMapLatest调用中可以调用onNext,但不能调用onCompleted?任何帮助都将不胜感激。提前谢谢

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

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

\=Observable.interval(1,调度程序:MainScheduler.instance)
.debug(“在flatmap之前”)
.flatMap{.just($0*2)}
.debug(“在flatmap之后”)
.subscribe()
实际上,
Variable
仅在解除分配时发出completed。看见 请注意,RxSwift 4中不推荐使用该变量,建议您改用RxCocoa类似的
行为relay

脱硝{
_主题。关于(.completed)
}

既然你说你是新来的,而且“有点模糊”

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

还要记住,如果一个可观测对象发出一个
.completed
,它就死了。它再也不能发射任何其他东西了

因此,
flatMapLatest
无法完成(除非其源代码已完成)。如果完成,它将杀死整个管道,并且对
localVar
的更改将不会通过管道路由,
ajaxLoad(var:1)
将不会使用新值再次调用,并且不会将更多内容推送到subscribe的onNext方法


可将一系列可观测数据视为Rube Goldberg机器,其中一个
完成的
关闭机器,一个
错误
破坏机器。您应该关闭计算机的唯一时间是源(在本例中为
localVar
)已完成发送值,或者接收器(在本例中为目标,在onNext:closure)不需要更多值。

但请注意,内部序列中未经处理的错误将终止外部序列(
flatMap{.error(SomeError))(“错误”))}
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()
  }
}