Quiero que se informe a un objeto "controlador" o "modelo de vista" de los cambios en un objeto en el modelo de datos. Así que configuré un editor Combine en el objeto del modelo de datos, que publica cada vez que uno de los valores de sus miembros cambia:
import Foundation
import Combine
class User : Codable, Equatable, ObservableObject
{
var ID: String = ""
{
didSet {
changePublisher.send(self)
}
}
var pw: String = ""
{
didSet {
changePublisher.send(self)
}
}
var username: String = ""
{
didSet {
changePublisher.send(self)
}
}
var firstName: String = ""
{
didSet {
changePublisher.send(self)
}
}
var lastName: String = ""
{
didSet {
changePublisher.send(self)
}
}
var validated: Bool = false
{
didSet {
print("Publishing validated change.")
changePublisher.send(self)
}
}
let changePublisher = PassthroughSubject<User, Never>()
...
}
Y aquí está el objeto que quiere saber acerca de los cambios realizados en el Usuario anterior:
class UserManager : ObservableObject
{
var model: CentralModel
var userChangePipeline: [AnyCancellable] = []
init(withModel: CentralModel)
{
model = withModel
model.user.changePublisher.sink(receiveValue: { changedUser in
print("Changed-user validation: \(changedUser.validated)")
.store(in: &userChangePipeline)
}
...
}El objeto Usuario imprime el mensaje "publicando cambio validado" cuando modifico ese valor, lo que demuestra que se llaman los métodos didSet. Pero nunca se llama al receptor del suscriptor. Tenga en cuenta que estoy guardando la suscripción.