UIView 作为@EnvironmentObject 的订阅者
UIView as a subscriber to @EnvironmentObject
我有一个在工作线程中更新的@EnvironmentObject,并且几个 SwiftUI 视图订阅了对已发布值的更改。
这一切都很好。
但我正在努力让 UIView 订阅@EnvironmentObject 中的更改。
给出
@EnvironmentObject var settings: Settings
where Settings is:
final class Settings {
@Published var bar: Int = 0
@Published var beat: Int = 1
etc.
}
SwiftUI 视图根据发布的值变化进行更新。
但是现在,我想在符合 UIViewRepresentable 的 UIView 中声明一个接收发布值的接收器。
我一直在研究 Combine 这本书,并认为我可以用类似的东西声明一个 .sink 闭包:
func subscribeToBeatChanges() {
settings.$bar
.sink(receiveValue: {
bar in
self.bar = bar
print("Bar = \(bar)")
} )
settings.$beat
.sink(receiveValue: {
beat in
self.beat = beat
print("Beat = \(beat)")
self.setNeedsDisplay()
} )
}
不幸的是,闭包仅在调用 subscribeToBeatChanges() 时被调用一次。我想要的是每次 @EnvironmentObject 值中的 @Published 属性 更改时调用闭包。
我也尝试在 UIViewRepresentable 包装器内部订阅,在 makeUIView 方法中使用一些东西,但没有成功。
我显然犯了一些相当简单和根本的错误,并且肯定会感谢您朝正确的方向推动,因为我正试图弄清楚这个问题!
谢谢!
您必须存储对从 .sink
收到的 AnyCancellable
的引用:
private var cancellables = Set<AnyCancellable>()
func subscribeToBeatChanges() {
settings.$bar
.sink(receiveValue: {
bar in
self.bar = bar
print("Bar = \(bar)")
} )
.store(in: &cancellables) // <-- store the instance
settings.$beat
.sink(receiveValue: {
beat in
self.beat = beat
print("Beat = \(beat)")
self.setNeedsDisplay()
} )
.store(in: &cancellables) // <-- store the instance
}
如果您不存储它,AnyCancellable
实例将在 deinit 时自动取消订阅。
我有一个在工作线程中更新的@EnvironmentObject,并且几个 SwiftUI 视图订阅了对已发布值的更改。
这一切都很好。
但我正在努力让 UIView 订阅@EnvironmentObject 中的更改。
给出
@EnvironmentObject var settings: Settings
where Settings is:
final class Settings {
@Published var bar: Int = 0
@Published var beat: Int = 1
etc.
}
SwiftUI 视图根据发布的值变化进行更新。
但是现在,我想在符合 UIViewRepresentable 的 UIView 中声明一个接收发布值的接收器。
我一直在研究 Combine 这本书,并认为我可以用类似的东西声明一个 .sink 闭包:
func subscribeToBeatChanges() {
settings.$bar
.sink(receiveValue: {
bar in
self.bar = bar
print("Bar = \(bar)")
} )
settings.$beat
.sink(receiveValue: {
beat in
self.beat = beat
print("Beat = \(beat)")
self.setNeedsDisplay()
} )
}
不幸的是,闭包仅在调用 subscribeToBeatChanges() 时被调用一次。我想要的是每次 @EnvironmentObject 值中的 @Published 属性 更改时调用闭包。
我也尝试在 UIViewRepresentable 包装器内部订阅,在 makeUIView 方法中使用一些东西,但没有成功。
我显然犯了一些相当简单和根本的错误,并且肯定会感谢您朝正确的方向推动,因为我正试图弄清楚这个问题!
谢谢!
您必须存储对从 .sink
收到的 AnyCancellable
的引用:
private var cancellables = Set<AnyCancellable>()
func subscribeToBeatChanges() {
settings.$bar
.sink(receiveValue: {
bar in
self.bar = bar
print("Bar = \(bar)")
} )
.store(in: &cancellables) // <-- store the instance
settings.$beat
.sink(receiveValue: {
beat in
self.beat = beat
print("Beat = \(beat)")
self.setNeedsDisplay()
} )
.store(in: &cancellables) // <-- store the instance
}
如果您不存储它,AnyCancellable
实例将在 deinit 时自动取消订阅。