我是新手。我知道我们可以像这样用NotificationCenter的组合实现发送值:
let myNotification = Notification.Name("myNotification")
class Cat {
var breed : String
init(breed: String) {
self.breed = breed
}
}
class ClassA {
var myCat = Cat(breed:"Ragdoll")
func sendNotification() {
NotificationCenter.default
.post(name: myNotification,
object: nil,
userInfo: ["cat": myCat])
}
}
class ClassB {
let cancellable = NotificationCenter.default
.publisher(for: myNotification).map ({ $0.userInfo!["cat"] as! Cat}).sink { cat in
print("My cat's breed is : (cat.breed)")
}
}
let a = ClassA()
let b = ClassB()
a.sendNotification()
这里ClassB不知道我将从ClassA获取数据,它只监听通知。
当我想使用currentvaluessubject:
class Cat {
var breed : String
init(breed: String) {
self.breed = breed
}
}
class ClassA {
let myCat : Cat = Cat(breed: "Ragdoll")
lazy var currentValueSubject = CurrentValueSubject<Cat, Never>(myCat)
func setMyCat() {
currentValueSubject.value = myCat
}
}
class ClassB {
let classA = ClassA()
var cancellables = [AnyCancellable]()
init(){
getMyCat()
}
func getMyCat() {
let _ = classA.currentValueSubject
.sink { cat in
print("My cat's breed: (cat.breed)")
}.store(in: &cancellables)
}
}
let a = ClassA()
let b = ClassB()
a.setMyCat()
是否有一种方法来创建currentvaluessubject并通过NotificationCenter侦听它,因此接收者可以不知道发布者的来源?
我应该触发NotificationCenter.default.post....在第一个方法中发布更改,但接收器不知道源。它在第二个方法中自动触发更改,不需要发布任何内容,但接收器并不知道发布者的来源,因为我们必须说" classa . currentvaluessubject ....">
我想设置一个发布者(currentvaluessubject或PassthroughSubject)并在NotificationCenter上订阅它,而不发布任何内容。
有可能吗?
NotificationCenter
中的CurrentValueSubject
和Publisher
是两个不同的api。它们是不可互换的,但它们的行为却非常相似。
- 要能够订阅
CurrentValueSubject
,您必须有对主题的引用。调用send()
或设置value
发布一个值 NotificationCenter
的引用是它的共享(default
)实例,发布通知会发布一个值。