此bounty已结束。回答此问题可获得+50声望奖励。赏金宽限期4小时后结束。Daniel希望引起更多关注这个问题。
我想在发布第一个发布服务器后运行第二个发布服务器,但要设置超时。
就像这样:
publisher1.flatMap{ _ in
publisher2.timeout(1, scheduler: RunLoop.main)
}
.handleEvents(receiveCancel: {
})
.sink { _ in
} receiveValue: { success in
}
(Note:publisher2是一个发布者,它在接收到一个套接字事件时发布,这并不能保证一直运行,所以我想在那里设置一个超时,这样即使有错误也可以完成上面的操作。
我该怎么做?
1条答案
按热度按时间enxuqcxy1#
下面是一个Playground的源代码,它演示了我认为您正在尝试实现的功能,并有一些代码来练习该功能。
在代码中,
publisher1
和publisher2
是PassthroughSubjects
,这是一个简单的发布器,在示例中使用非常方便,因为您可以在任何时候通过它们发送值。在
subscribeToPipelines
中,代码构建了一个新的管道withTimeout
,它从pipeline2
获取输入,如果在1秒内没有发布任何内容,则会超时。当pipeline1
通过flatMap
接收值时,该管道将进行控制withTimeout
的结果由sink
运算符捕获。代码处理withTimeout
的可能条件,它可能已经正常完成,它可能已经超时,并且它可能接收一个值。print
语句涵盖了所有情况。代码使用
Task
来执行管道,因为Task.sleep
是一种简单的延迟方式。第一个练习展示了如果publisher1
接收到一个值,而publisher2
在半秒后接收到一个值,会发生什么。第二个练习展示了如果publisher2
延迟发布值1.5秒(超时)会发生什么。