【问题标题】:Observing a @Published var from another Object从另一个对象观察 @Published 变量
【发布时间】:2020-08-19 03:05:55
【问题描述】:

我试图让一个对象监听另一个对象的属性变化。我让它按如下所示工作,但我希望观察对象对模型一无所知,只知道属性。

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)

谁能解释我需要做什么?谢谢!

【问题讨论】:

    标签: swift combine


    【解决方案1】:

    如果您不关心值的来源,您可以只接受发布者作为参数。

    在您非常具体的情况下,可能是:

    func observeItems(propertyToObserve: Published<[Int]>.Publisher) {
       itemObserver = propertyToObserve
                         .sink { self.items = $0 }
    }
    

    但这可能过于严格 - 为什么只有这个特定的发布者?原则上,你不应该关心发布者是什么——你只关心输出值和错误类型。您可以使其对任何发布者通用,只要它的输出是[Int] 并且失败是Never(就像@Published 一样):

    func observeItems<P: Publisher>(propertyToObserve: P) 
       where P.Output == [Int], P.Failure == Never {
    
       itemObserver = propertyToObserve
                         .sink { self.items = $0 }
    } 
    

    用法是这样的:

    let model = Model()
    let itemUser = ObjectUsingItems()
            
    itemUser.observeItems(propertyToObserve: model.$items)
    

    【讨论】:

    • 非常感谢新开发者 - 完美运行,我永远也想不通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多