防止立即调用 sink receiveValue 闭包
Prevent sink receiveValue closure from being called immediately
考虑以下代码(您可以将其直接 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
从未改变,但接收器立即执行它的 receiveValue
闭包。有什么办法可以防止这个初始调用发生,例如有没有我可能忽略的运算符?
您可以使用 dropFirst
运算符。没有参数,它只丢弃来自上游的第一个输出。
let someSubscriber = foo.$bar
.dropFirst()
.sink { value in
print("value is \(value)")
}
解决评论中提出的问题:
Publisher
的每个实现都可以决定如何处理每个新订阅者。这是一项政策决定,通常不是设计缺陷。不同的 Publisher
做出不同的决定。以下是一些示例:
PassthroughSubject
不会立即发布任何内容。
CurrentValueSubject
立即发布其当前值。
NSObject.KeyValueObservingPublisher
立即发布观察到的 属性 的当前值当且仅当它是使用 .initial
选项创建的。
Published.Publisher
(这是您为 @Published
属性 获得的类型)立即发布 属性 的当前值。
考虑以下代码(您可以将其直接 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
从未改变,但接收器立即执行它的 receiveValue
闭包。有什么办法可以防止这个初始调用发生,例如有没有我可能忽略的运算符?
您可以使用 dropFirst
运算符。没有参数,它只丢弃来自上游的第一个输出。
let someSubscriber = foo.$bar
.dropFirst()
.sink { value in
print("value is \(value)")
}
解决评论中提出的问题:
Publisher
的每个实现都可以决定如何处理每个新订阅者。这是一项政策决定,通常不是设计缺陷。不同的 Publisher
做出不同的决定。以下是一些示例:
PassthroughSubject
不会立即发布任何内容。CurrentValueSubject
立即发布其当前值。NSObject.KeyValueObservingPublisher
立即发布观察到的 属性 的当前值当且仅当它是使用.initial
选项创建的。Published.Publisher
(这是您为@Published
属性 获得的类型)立即发布 属性 的当前值。