我有一个问题,不知道如何解决。
在我的ViewModel中,我有带值的Observable字段。
self.diseaseDetails = Observable<Disease>.create { (observer) -> Disposable in
_ = SAPI.get().diseases(diseases: 5, success: { (disease) in
observer.on(.next(disease))
observer.on(.completed)
}) { (failedMessage) in
observer.on(.completed)
}
return Disposables.create()
}
像这样从可观察的数据中获取数据:
public func getSections() -> Observable<String?> {
return self.details().map { $0.sections }
}
public func getDiagnostics() -> Observable<String?> {
return self.details().map { $0.diagnostics }
}
private func details() -> Observable<Disease> {
return Observable.of(
self.disease.asObservable(),
self.diseaseDetails.take(1)
).merge()
}
但是, 在此示例中提出了两个请求。对于许多订阅,我只需要一个请求。有想法吗?
答案 0 :(得分:2)
为了仅确保一个网络请求,您需要通过在其上调用UPDATE FO
SET [FO.Total Revenue] = ISNULL(FO.[STORAGE], 0) + ISNULL(FO.[HANDLING], 0) + ISNULL(FC.[LINER Revenue],0)
FROM [dbo].[FCLOverall] AS FO
INNER JOIN [dbo].[FCL_Child] FC on FO.[FO.Container No] = FC.[Container No]
来使Observable成为热点。在这种情况下,您可能还希望将其设置为重播.share()
。但是,请记住,这将意味着.share(replay: 1)
仅会发出一个请求,然后在每次被请求时吐出该响应。使用当前构建代码的方式,这意味着无需刷新。
流的工作方式是,当您预订Observable时,订阅将一直向上流到源,并调用您为diseaseDetails
函数提供的闭包。因此,默认情况下,每个订阅会调用包含您的create
函数的闭包(这称为“冷”可观察的对象。)但是,还有其他创建可观察的对象的方法,也有一些简短的方法-循环这种行为。发生这种情况时,可观察对象被视为“热门”。 SAPI.get()...
运算符是这些方式之一。当第一个订阅请求进入时,它将订阅上游的Observable,但是对于任何后续的订阅请求,它将仅将新的观察者添加到其列表中,并将任何后续的响应发送给新的观察者。如果您告诉运营商“重播:n”,它将存储上游可观察到的最后.share()
个事件,并在它们连接时立即将它们发送给新订户。
您将明确忽略网络请求的结果(n
代码)。该函数的结果很有可能是一个允许您取消请求的对象,因此应在_ = SAPI.get()...
中使用该对象来实现取消。