我正试图弄清楚如何等待一个可观察到的结果完成,以便让另一个发出值。基本上,后端会向我发送一系列必须执行的操作,作为对GET API调用的响应。假设行动是:
- 动作1
- 行动2
- 行动3
目前,我正在为每一个可能的操作做以下操作:
APIResponse
.filter{$0.0}
.subscribe(onNext: { flag in
//handle code here
}).disposed(by: disposeBag)
因此,在我的代码中,我有三个不同的块,看起来像上面的那个块,一个用于Action 1,另一个用于Action2,还有一个用于action3。
今天,我做了一个测试,并立即启用了我的所有操作。我有两个警报/视图控制器显示在一起,因为我所有的可观察对象都在同一时间发出。我收到了第三次行动的警告,说VC已经发出警报,无法发出第三次警报(通常是这样(。
无论后端发送给我什么,我都希望自己处理每个操作,这样我就可以一次收到一个或3个操作。所以我想要的是让VC/警报消失,并完全完成对另一个动作的处理。
如果所有操作都是空的,我希望UI什么都不做,继续显示主屏幕。
有人能提出有用的建议吗?
根据给出的信息,这应该有效:
let sharedResponse = apiResponse
let result1 = sharedResponse
.filter { $0.shouldDoAction1 }
.flatMap { _ in action1() }
let result2 = sharedResponse
.filter { $0.shouldDoAction2 }
.flatMap { _ in action2() }
Observable.concat(result1, result2)
.withLatestFrom(sharedResponse)
.filter { $0.shouldDoAction3 }
.subscribe(onNext: { _ in
action3()
})
.disposed(by: disposeBag)
以上假设action1()
和action2()
是类型() -> Observable<Void>
,并且当它们完成执行它们的动作时,它们发出完成的事件。它们也将在响应发出完成事件时完成,即使它们没有发出任何下一个事件。
我的CLE库提供了将视图控制器表示转换为操作的包装器。例如:
let result1 = sharedResponse
.filter { $0.shouldDoAction1 }
.flatMap(presentScene(animated: true) { _ in
UIAlertController(title: "Action1", message: nil, preferredStyle: .alert)
.scene { $0.connectOK() }
})