从另一个对象观察@Published var
Observing a @Published var from another Object
我试图让一个对象监听另一个对象 属性 的变化。我让它工作如下所示,但我更希望观察对象对模型一无所知,只是 属性.
class Model : ObservableObject{
@Published var items: [Int] = []
}
class ObjectUsingItems{
var itemObserver: AnyCancellable?
var items: [Int] = []
func observeItems(model: Model){
itemObserver = model.$items
.sink{ newItems in
self.items = newItems
print("New Items")
}
}
}
此刻我开始观察 model.items 如下 - 有效:
let model = Model()
let itemUser = ObjectUsingItems()
itemUser.observeItems(model: model)
model.items.append(1) // itemUser sees changes
不幸的是,我似乎无法弄清楚 observeItems 方法需要什么参数才能在不了解模型的情况下工作 - 就像这样:
class ObjectUsingItems{
var itemObserver: AnyCancellable?
var items: [Int] = []
func observeItems(propertyToObserve: WhatGoesHere?){
itemObserver = propertyToObserve
.sink{ newItems in
// etc.
}
}
}
然后这样称呼它:
itemUser.observeItems(XXX: model.$items)
谁能解释一下我需要做什么?谢谢!
如果您不关心值的来源,您可以只接受发布者作为参数。
在您的具体情况下,可能是:
func observeItems(propertyToObserve: Published<[Int]>.Publisher) {
itemObserver = propertyToObserve
.sink { self.items = [=10=] }
}
但这可能限制太多 - 为什么只有这个特定的发布者?原则上,您不应该关心发布者是什么——您只关心输出值和错误类型。您可以使它对任何发布者通用,只要它的输出是 [Int]
并且失败是 Never
(就像 @Published
那样):
func observeItems<P: Publisher>(propertyToObserve: P)
where P.Output == [Int], P.Failure == Never {
itemObserver = propertyToObserve
.sink { self.items = [=11=] }
}
用法是这样的:
let model = Model()
let itemUser = ObjectUsingItems()
itemUser.observeItems(propertyToObserve: model.$items)
我试图让一个对象监听另一个对象 属性 的变化。我让它工作如下所示,但我更希望观察对象对模型一无所知,只是 属性.
class Model : ObservableObject{
@Published var items: [Int] = []
}
class ObjectUsingItems{
var itemObserver: AnyCancellable?
var items: [Int] = []
func observeItems(model: Model){
itemObserver = model.$items
.sink{ newItems in
self.items = newItems
print("New Items")
}
}
}
此刻我开始观察 model.items 如下 - 有效:
let model = Model()
let itemUser = ObjectUsingItems()
itemUser.observeItems(model: model)
model.items.append(1) // itemUser sees changes
不幸的是,我似乎无法弄清楚 observeItems 方法需要什么参数才能在不了解模型的情况下工作 - 就像这样:
class ObjectUsingItems{
var itemObserver: AnyCancellable?
var items: [Int] = []
func observeItems(propertyToObserve: WhatGoesHere?){
itemObserver = propertyToObserve
.sink{ newItems in
// etc.
}
}
}
然后这样称呼它:
itemUser.observeItems(XXX: model.$items)
谁能解释一下我需要做什么?谢谢!
如果您不关心值的来源,您可以只接受发布者作为参数。
在您的具体情况下,可能是:
func observeItems(propertyToObserve: Published<[Int]>.Publisher) {
itemObserver = propertyToObserve
.sink { self.items = [=10=] }
}
但这可能限制太多 - 为什么只有这个特定的发布者?原则上,您不应该关心发布者是什么——您只关心输出值和错误类型。您可以使它对任何发布者通用,只要它的输出是 [Int]
并且失败是 Never
(就像 @Published
那样):
func observeItems<P: Publisher>(propertyToObserve: P)
where P.Output == [Int], P.Failure == Never {
itemObserver = propertyToObserve
.sink { self.items = [=11=] }
}
用法是这样的:
let model = Model()
let itemUser = ObjectUsingItems()
itemUser.observeItems(propertyToObserve: model.$items)