提问者:小点点

为什么我不能从第二个类调用。发送一个类中的发布服务器,并让它在第三个类中更新订阅?


我在lrvdetails.swift上有这门课

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是一个类,所以它只存储一个引用。 所以如果我只是在每个文件中实例化它,然后对它调用send(),发布者应该更新,然后将值发送给LRVViewController订阅并更新标题。

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

这是因为订阅服务器存储在LRVCoordinator中的'subs'变量中,因此必须用LRVViewController中的订阅服务器更新它吗? 那是我最好的赌注。

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

谢啦!


共1个答案

匿名用户

我以为因为LRVDetails是一个类,所以它只存储一个引用。 所以如果我只是在每个文件中实例化它,然后对它调用send(),发布者应该更新

你的理解是不正确的。 您已经创建了两个不同的LRVDetails对象。 (语法lrvdetails()创建一个新对象)一个在VC中,另一个在协调器中。 但是,它存储引用是正确的,因此,如果实际使两个details变量引用相同的lrvdetails,它就会工作。

但实际上,您似乎不需要在协调器中使用details变量。 因为协调器是VC的委托,所以您可以通过委托方法传递lrvdetails:

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

不用说,您还应该更改UserDidPressButton的调用方,以传递self作为参数。