使用RxSwift

时间:2018-10-23 11:27:53

标签: rx-swift rx-cocoa

我有一个问题,不知道如何解决。

在我的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()
    }

但是, 在此示例中提出了两个请求。对于许多订阅,我只需要一个请求。有想法吗?

1 个答案:

答案 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()...中使用该对象来实现取消。