我目前正在使用RIB和ReactorKit绑定网络数据。这里的问题是,网络结果显示为Observables,我很难将其绑定到ReactorKit。请告诉我是否有一种方法可以剥离Observable或将其转化为值。就像当BehaviorRelay是.value时,值就出来了。。。
dependency.loadData.getData().flatMap { $0.detailData.flatMap { $0.result }}
====>gt;可观察
现在我该怎么办?TT
请告诉我是否有办法剥离Observable或将其转换为值。
这被称为";留下";或";断开";monad和是一种代码气味。
在生产代码中,很少建议"打破monad",尤其是从可观察序列转移到块方法。应该谨慎地在异步和同步范例之间切换,因为这是并发问题(如死锁和可伸缩性问题(的常见根本原因。
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
时,它将具有从可观察对象发出的最后一个值。你冒着比赛条件的风险这样做,这取决于你自己。
这是你问题的直接答案,但并不是全部。在ReactorKit中,API调用应该在reactor的mutate()
函数中进行。该函数返回一个Observable<Mutation>
,因此您不应该破坏monad,而应该将API响应映射到一个突变中,该突变可能是一个特定的枚举情况,然后传递到reduce()
函数中。