RxJava如何让Observable等待另一Observable发射后再下发数据?
问题解答
你当前使用combineLatest的实现存在逻辑缺陷:仅能拿到绿灯触发前上游发射的最新一条数据,如果绿灯触发前上游发射了多条数据,前面的会被丢弃,和你给出的预期时序不符。
针对不同的流类型,有更优雅且符合需求的实现方案:
场景1:contentStream是冷Observable(如静态数据集封装的流,订阅后才开始发射数据)
直接用内置的delaySubscription操作符即可,语义清晰无额外转换:
contentStream // 延迟订阅上游,直到绿灯第一次发射信号 .delaySubscription(greenLight.take(1))
场景2:contentStream是热Observable(如事件总线、UI事件流这类订阅前就可能发射数据的流)
需要先缓存绿灯触发前的所有数据,绿灯触发后先输出缓存再实时转发后续数据,核心库通用实现如下:
Observable.merge( // 取出绿灯触发前的所有上游数据,一次性批量发射 contentStream.takeUntil(greenLight).toList().flatMapObservable(Observable::fromIterable), // 接收绿灯触发后的所有实时上游数据 contentStream.skipUntil(greenLight) )
以上方案相比你当前的实现有明显优势:
- 操作符语义明确,无需额外的Pair转换和字段过滤,代码可读性更高
- 不会丢失绿灯触发前的任何上游数据,完全匹配你给出的预期时序
- 基于内置操作符实现,性能更优,避免不必要的组合计算开销
内容的提问来源于stack exchange,提问作者Some Noob Student
相关产品推荐
相关产品推荐

