为什么我不能在第二个 class 中在 class 中对发布者调用 .send 并让它在第三个 class 中更新订阅?

Why can't I call .send on a publisher in a class from a second class and have it update the subscription in third class?

我在 LRVDetails.swift

中有这个 class
class LRVDetails {
    var heading = CurrentValueSubject<String, Never>(K.LRV.Register)
    // other publishers
}

我在 LRVViewController.swift

中分配了这个
private var details = LRVDetails()
private var subs = Set<AnyCancellable>()

override func viewDidLoad() {
    super.viewDidLoad()

    details
        .heading
        .assign(to: \.text!, on: heading)
        .store(in: &subs)
}

在LRVCoordinator.swift我有

private var details = LRVDetails()

func UserDidPressButton() { // this is a delegate method from the VC
    details.heading.send("New Heading")
}

我认为因为 LRVDetails 是一个 class,它只存储一个引用。因此,如果我只是在每个文件中实例化它,然后对其调用 send(),发布者应该更新,然后将值发送到 LRVViewController 订阅并更新标题。

但它什么也没做。订户永远不会收到值(我用 .print() 运算符检查过)。当我在协调器中调用 lrvController?.details.send() - 没有私有标记 - 时,它工作正常。

是否因为订阅者存储在LRVCoordinator中的'subs'变量中,因此必须与LRVViewController中的订阅者一起更新?这是我最好的选择。

如果不是,为什么这不起作用?

谢谢!

编辑:

如果它们是不同的实例,为什么这段代码打印两个?

class myClass {
 var int = 1
}

let test1 = myClass()
let test2 = myClass()

test1.int = 2
print(test2.int)
// prints 2

I thought that because LRVDetails is a class, it only stores a reference. so if I simply instantiate it in each file and then call send() on it, the publisher should update

您的理解有误。您创建了两个不同的 LRVDetails 对象。 (语法 LRVDetails() 创建一个新对象)一个在 VC 中,另一个在协调器中。你是正确的,它存储 references 不过,所以如果你实际上使两个 details 变量引用相同的 LRVDetails.

它会起作用

但实际上,协调器中似乎不需要 details 变量。由于协调器是 VC 的委托,您可以通过委托方法传递 LRVDetails

func UserDidPressButton(_ viewController: LRVViewController) {
    viewController.details.heading.send("New Heading")
}

不用说,你也应该把UserDidPressButton的调用者改成传self作为参数。