尝试将值注入发布者,但收到无序值
Trying to inject values into a publisher, but receiving unordered values
这是对我试图使用 combine 实现的目标的过度简化。
如果发生某些事情,我需要向共享发布者注入一个值。
在这里你看到如果地图接收到数字 2 我使用原始发布者上的发送命令注入数字 3.
我希望收到一个数字序列,但我在触发它的事件之前收到了数字 3。
let pub = PassthroughSubject<Int, Never>()
let pubSharered = pub.share().eraseToAnyPublisher()
let anyCanc = pubSharered
.map { value -> Int in
switch value {
case 2:
pub.send(3)
return value
default:
return value
}
}.sink { (value) in
print("Sink: \(value)")
}
pub.send(0)
pub.send(1)
pub.send(2)
pub.send(4)
输出是:0,1,3,2,4
我期待的是 0,1,2,3,4
。
有人可以解释一下吗?
这似乎是 flatMap
的一个用例。你可以像这样平面映射到 Publishers.Sequence<[Int], Never>
:
let anyCanc = pubSharered
.flatMap { value -> Publishers.Sequence<[Int], Never> in
switch value {
case 2:
return [value, 3].publisher // value, plus a 3
default:
return [value].publisher // change nothing
}
}.sink { (value) in
print("Sink: \(value)")
}
这是对我试图使用 combine 实现的目标的过度简化。
如果发生某些事情,我需要向共享发布者注入一个值。
在这里你看到如果地图接收到数字 2 我使用原始发布者上的发送命令注入数字 3.
我希望收到一个数字序列,但我在触发它的事件之前收到了数字 3。
let pub = PassthroughSubject<Int, Never>()
let pubSharered = pub.share().eraseToAnyPublisher()
let anyCanc = pubSharered
.map { value -> Int in
switch value {
case 2:
pub.send(3)
return value
default:
return value
}
}.sink { (value) in
print("Sink: \(value)")
}
pub.send(0)
pub.send(1)
pub.send(2)
pub.send(4)
输出是:0,1,3,2,4
我期待的是 0,1,2,3,4
。
有人可以解释一下吗?
这似乎是 flatMap
的一个用例。你可以像这样平面映射到 Publishers.Sequence<[Int], Never>
:
let anyCanc = pubSharered
.flatMap { value -> Publishers.Sequence<[Int], Never> in
switch value {
case 2:
return [value, 3].publisher // value, plus a 3
default:
return [value].publisher // change nothing
}
}.sink { (value) in
print("Sink: \(value)")
}