[英]How should I use a guard statement correctly with RxSwift Singles?
[英]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) }
}
重要的部分是compactMaps
到cell
中的位置。 這按預期工作。 但我還有另一個 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.