忽略 CwlSignal 发送的先前值
Ignore previous values sent by a CwlSignal
我有一个 continuous
父信号,我从中导出各种其他信号。大多数订阅者都接受“连续”语义,这意味着他们确实希望在订阅时收到最后一个值。但是对于一些订阅者,我只想接收未来的值,而不是初始值。示例:
import CwlSignal
let (input, signal) = Signal<Int>.create { s in s.continuous() }
input.send(value: 1)
input.send(value: 2)
let e1 = signal.subscribeValues { val in
print("A: \(val)")
}
let e2 = signal.subscribeValues { val in
print("B: \(val)")
}
input.send(value: 3)
input.close()
这会打印:
A: 2
B: 2
A: 3
B: 3
现在我希望第二个订阅不接收初始值,即。输出应如下所示:
A: 2
A: 3
B: 3
是否可以在不调整父信号的情况下获得这种行为?
我从未使用过 CwlSignal,但它 looks like it has a skip
operator 与大多数响应式框架一样。这个有用吗?
let e2 = signal.skip(1).subscribeValues { val in
print("B: \(val)")
}
这可以使用 multicast
信号来解决,引用 reply from the library author:
let (input, multicastSignal) = Signal<Int>.create { s in s.multicast() }
let continuousSignal = multicastSignal.continuous()
input.send(value: 1)
input.send(value: 2)
let e1 = continuousSignal.subscribeValues { val in
print("A: \(val)")
}
let e2 = multicastSignal.subscribeValues { val in
print("B: \(val)")
}
input.send(value: 3)
我有一个 continuous
父信号,我从中导出各种其他信号。大多数订阅者都接受“连续”语义,这意味着他们确实希望在订阅时收到最后一个值。但是对于一些订阅者,我只想接收未来的值,而不是初始值。示例:
import CwlSignal
let (input, signal) = Signal<Int>.create { s in s.continuous() }
input.send(value: 1)
input.send(value: 2)
let e1 = signal.subscribeValues { val in
print("A: \(val)")
}
let e2 = signal.subscribeValues { val in
print("B: \(val)")
}
input.send(value: 3)
input.close()
这会打印:
A: 2
B: 2
A: 3
B: 3
现在我希望第二个订阅不接收初始值,即。输出应如下所示:
A: 2
A: 3
B: 3
是否可以在不调整父信号的情况下获得这种行为?
我从未使用过 CwlSignal,但它 looks like it has a skip
operator 与大多数响应式框架一样。这个有用吗?
let e2 = signal.skip(1).subscribeValues { val in
print("B: \(val)")
}
这可以使用 multicast
信号来解决,引用 reply from the library author:
let (input, multicastSignal) = Signal<Int>.create { s in s.multicast() }
let continuousSignal = multicastSignal.continuous()
input.send(value: 1)
input.send(value: 2)
let e1 = continuousSignal.subscribeValues { val in
print("A: \(val)")
}
let e2 = multicastSignal.subscribeValues { val in
print("B: \(val)")
}
input.send(value: 3)