如何 rxswift Observable 值?

how to rxswift Observable to value?

我目前正在使用 RIB 和 ReactorKit 来绑定网络数据。 这里的问题是网络结果作为 Observables 出现,我很难将其绑定到 ReactorKit。 请让我知道是否有办法剥离 Observable 或将其转化为一个值。 就像当BehaviorRelay是.value的时候,value就出来了...

    dependency.loadData.getData().flatMap { [=10=].detailData.flatMap { [=10=].result }}

====>> 可观察

现在我该怎么办? TT

Please let me know if there is a way to strip the Observable or turn it into a value.

这称为“离开”或“破坏”monad,是一种代码味道。

In production code, it is rarely advised to 'break the monad', especially moving from an observable sequence to blocking methods. Switching between asynchronous and synchronous paradigms should be done with caution, as this is a common root cause for concurrency problems such as deadlock and scalability issues.

-- Intro to Rx

如果你绝对必须这样做,那么这里有一个方法:

class MyClass { 
    private (set) var value: Int = 0
    private let disposeBag = DisposeBag()

    init(observable: Observable<Int>) {
        observable
            .subscribe(onNext: { [weak self] new in
                self?.value = new
            }
            .disposed(by: disposeBag)
    }
}

使用上面的方法,当您查询 value 时,它将具有从 observable 发出的最后一个值。这样做会冒竞争条件的风险,这由您来处理。

这是对您问题的直接回答,但这不是全部。在 ReactorKit 中,应该在反应器的 mutate() 函数中调用 API 。该函数 returns 一个 Observable<Mutation> 所以不要破坏 monad,您应该只是将 API 响应映射到 Mutation 中,这可能是一个特定的枚举案例,然后传递给您的 reduce()函数。