swift - 防止立即调用 sink 的 receiveValue 闭包
问题描述
考虑以下代码(您可以直接将其 c&p 到 Playground 中):
class Foo: ObservableObject {
@Published var bar = "bar"
}
let foo = Foo()
let someSubscriber = foo.$bar
.sink { value in
print("value is \(value)")
}
尽管 Foo 刚刚被初始化一次并且它的成员bar
从未改变过,但是 sink 会receiveValue
立即执行它的闭包。有什么方法可以防止这种初始呼叫的发生,例如,有没有我可能忽略的操作员?
解决方案
您可以使用dropFirst
运算符。没有参数,它只删除上游的第一个输出。
let someSubscriber = foo.$bar
.dropFirst()
.sink { value in
print("value is \(value)")
}
为了解决评论中提出的问题:
的每个实现都Publisher
可以决定如何处理每个新订阅者。这是一个政策决定,通常不是设计缺陷。不同Publisher
的s做出不同的决定。这里有些例子:
PassthroughSubject
不会立即发布任何内容。CurrentValueSubject
立即发布其当前值。NSObject.KeyValueObservingPublisher
当且仅当它是使用.initial
选项创建时,立即发布观察到的属性的当前值。Published.Publisher
(这是您为@Published
属性获得的类型)立即发布属性的当前值。
推荐阅读
- python - 有没有办法在 python 的函数中将文本插入到数据框名称中?
- javascript - 如果项目的属性包含文本,如何过滤项目数组
- javascript - 如何在模式中重用现有的 HTML 元素?
- sql - SQL将2行加入1行有条件
- vue.js - 如果从下拉列表中选择图像,vuejs 隐藏 img src
- colors - 在地图上显示相互重叠的多条路线的最清晰方法是什么?
- javascript - bootstrap-vue b-table:在表重新加载时保持扩展行扩展
- dayjs - 月末使用dayjs、set和toISOstring构造月初日期
- r - ggplot geom_col:使某些轴计数整数而不是求和
- visual-studio-code - Visual Studio Code:是否可以在 *Opposite* 窗格中打开新文件(使用拆分窗格时)?