如何解决确保订阅接收只发生一次
我正在尝试编写一个“类似闭包”的组合观察者。 假设我有 MyClass
class MyClass {
@Published var value: Int = 0
func doSomethingClosure(completion: (Int?) -> Void) {
value += 1
completion(value)
}
func doSomethingCombine() {
value += 1
}
}
我可以使用一个带闭包的简单函数来访问它
let myClass = MyClass()
myClass.doSomethingClosure { (value) in
print(value)
}
现在,我想使用联合@Published 做同样的事情 所以我会打电话
var cancelSet: Set<AnyCancellable> = []
myClass.$value
.sink { (value) in
print(value)
}.store(in: &cancelSet)
但是,我希望它只被触发一次,所以如果我调用
for _ in 0..<5 {
myClass.doSomethingCombine()
}
我不会得到 5 张照片,而只会得到第一张。 我为此找到的一种解决方案是取消接收器内的订阅者:
myClass.$value
.sink { (value) in
print(value)
**cancelSet.removeAll()**
}.store(in: &cancelSet)
但我觉得它有点“不像预期的那样”。
另一种解决方案是使用背压方法,例如:
class MySubscriber: Subscriber {
typealias Input = Int
typealias Failure = Never
func receive(subscription: Subscription) {
subscription.request(.max(1))
}
func receive(completion: Subscribers.Completion<Never>) {
print("Subscription \(completion)")
}
func receive(_ input: Int) -> Subscribers.Demand {
print("Input:\(input)")
return .none
}
}
let mySubscriber = MySubscriber()
myClass.$value.subscribe(mySubscriber)
但我觉得它对我的使用来说既麻烦又矫枉过正。
有没有办法以干净的方式实现“闭包风格”?
谢谢。
解决方法
听起来像是https://developer.apple.com/documentation/combine/publishers/prefixwhile/prefix(_:)的工作
let numbers = (0...10)
cancellable = numbers.publisher
.prefix(2)
.sink { print("\($0)",terminator: " ") }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。