簡體   English   中英

我如何 flatMap 兩個單曲?

[英]How do I flatMap two singles?

我有一個看起來像這樣的observable

func getParameters() -> Single<[ParameterModel]?> {
    do {
        loading.accept(allParameters.isEmpty)
        return try parameterService.getParameters()
            .do(onSuccess: { [weak self] parameters in
                self?.loading.accept(false)
                self?.content.accept(parameters?.compactMap { $0 }
                                                .compactMap { TechnicianParameterTableViewCellViewModel(parameter: $0) } ?? [])
            })
    } catch { return Single.error(error) }
}

重要的部分是compactMapscell中的位置。 這按預期工作。 但我還有另一個 observable,看起來像這樣:

func getSingleOrDoubleDoor() -> Single<SingleOrDoubleDoor?> { //SingleOrDoubleDoor is an enum
    do {
        return try parameterService.getSingleOrDoubleDoor()
    } catch {
        return Single.error(error)
    }
}

現在,我想將getSingleOrDoubleDoor()合並到getParameters()中,這樣我就可以在onSuccess中訪問兩個observables對象的值。 我想使用這樣的結果:

.compactMap { TechnicianParameterTableViewCellViewModel(parameter: $0, isSingleOrDouble: $1) } ?? [])

不是Rx方面的專家,我仍然認為這是使用.flatMap{}完成的。 有點像:

...return try parameterService.getParameters().flatMap { _ in getSingleOrDoubleDoor() }...

但這給了我一個錯誤:

無法將類型“([ParameterModel]?) -> Single<SingleOrDoubleDoor?>”(又名“(Optional<Array>) -> PrimitiveSequence<SingleTrait, Optional>”)的值轉換為預期的參數類型“([ParameterModel]?)拋出 -> PrimitiveSequence<SingleTrait, [ParameterModel]?>'

嘗試更改返回表達式,但它仍然不會。 不知道如何做到這一點。

由於您的方法不接受參數,因此我假設它們不相互依賴。 如果是這樣,您應該像這樣使用zip方法:

Single
   .zip(getParameters(), getSingleOrDoubleDoor())
   .compactMap { TechnicianParameterTableViewCellViewModel(parameter: $0, isSingleOrDouble: $1) } ?? [])

zip 方法將在兩個方法都返回值時觸發 compactMap。 Flatmap有不同的用途,它通常在我們需要順序調用方法時使用,這意味着下一次調用需要前一次調用的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM