为什么我不能在第二个 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
作为参数。
我在 LRVDetails.swift
中有这个 classclass 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
作为参数。