我正在寻找一个行为如下的合并发布者/订阅者/订阅:
struct Change<Value> {
let new: Value
let previous: Value?
}
let pub = PassthroughSubject<Int, Never>()
let cancellable = pub
.change()
.sink { (change: Change<Int>) -> Void in
print(change)
}
pub.send(1) // prints Change(new: 1, previous: nil)
pub.send(2) // prints Change(new: 2, previous: 1)
pub.send(3) // prints Change(new: 3, previous: 2)
在提出正确的实施方案时遇到了麻烦。我已经制作了自己的Publisher / Subscription来包装外部API调用和排序,但是当需要保留某些状态时(例如本示例中的上一个值),我无法提出正确的组合(我认为这意味着您需要自定义订户?)
如果出于某种原因该.change()
语法不可行,则具有相同语义的替代语法也是可以接受的。
您可以像这样change
从scan
和map
运算符中构建运算符:
struct Change<Value> {
var old: Value?
var new: Value
}
extension Publisher {
func change() -> Publishers.Map<Publishers.Scan<Self, (Optional<Self.Output>, Optional<Self.Output>)>, Change<Self.Output>> {
return self
.scan((Output?.none, Output?.none)) { (state, new) in
(state.1, .some(new))
}
.map { (old, new) in
Change(old: old, new: new!)
}
}
}
演示:
let pub = PassthroughSubject<Int, Never>()
let ticket = pub
.change()
.sink { print($0) }
pub.send(1)
// Output: Change<Int>(old: nil, new: 1)
pub.send(2)
// Output: Change<Int>(old: Optional(1), new: 2)
pub.send(3)
// Output: Change<Int>(old: Optional(2), new: 3)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句