为什么Combine中的replaceEmpty算子没有被触发调用?
Combine 中
replaceEmpty 未触发的原因分析 核心触发条件
replaceEmpty(with:) 算子的触发逻辑非常明确:仅当上游发布者没有输出任何值、直接发送完成事件时,才会发送你设定的默认值,否则直接转发上游的所有输出和完成事件。
你当前的代码逻辑永远不会触发该算子,分两种参数场景解释:
场景1:Empty(completeImmediately: false)
append(_:)算子的执行逻辑是:先等待前序发布者完全完成,再开始订阅传入的拼接发布者,将后者的输出接在前面的输出之后。- 前序
[1,2].publisher会先输出1、2两个值,然后正常发送完成事件。 - 之后
append开始订阅Empty(completeImmediately: false):这个类型的Empty发布者不会输出任何值,也永远不会发送完成事件,整个流直接卡在这一步,既不会有新值输出,也不会触发完成回调。 - 此时
replaceEmpty已经收到了1、2两个值,本身就不符合"上游为空"的触发条件,自然不会输出3。
此时运行代码只会打印:
1 2
没有后续的完成日志,也不会出现3。
场景2:Empty(completeImmediately: true)
- 前序
[1,2].publisher还是会先输出1、2两个值,然后完成。 append订阅的Empty会立刻发送完成事件,没有任何值输出。所以append整体的输出就是1、2,之后发送完成事件。- 到
replaceEmpty这一步,上游已经输出了2个值,完全不符合"空流"的判定,算子不会触发替换逻辑,直接转发上游的输出和完成事件。
此时运行代码只会打印:
1 2 finished
依旧不会输出3。
触发replaceEmpty的示例
如果要看到替换效果,需要保证replaceEmpty的上游是无任何输出就完成的流,示例代码如下:
// 直接对空发布者使用replaceEmpty Empty<Int, Never>(completeImmediately: true) .replaceEmpty(with: 3) .sink { completion in print(completion) } receiveValue: { value in print(value) }
运行后会输出:
3 finished
内容的提问来源于stack exchange,提问作者Blazej SLEBODA
相关产品推荐
相关产品推荐

