如何等待首先不保证发出的可观察量完成?

  • 本文关键字:观察 何等待 等待 ios swift rx-swift
  • 更新时间 :
  • 英文 :


我正试图弄清楚如何等待一个可观察到的结果完成,以便让另一个发出值。基本上,后端会向我发送一系列必须执行的操作,作为对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() }
})

最新更新