Using NotificationCenter with CurrentValueSubject



我是新手。我知道我们可以像这样用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中的CurrentValueSubjectPublisher是两个不同的api。它们是不可互换的,但它们的行为却非常相似。

  • 要能够订阅CurrentValueSubject,您必须有对主题的引用。调用send()或设置value发布一个值
  • NotificationCenter的引用是它的共享(default)实例,发布通知会发布一个值。

相关内容

  • 没有找到相关文章

最新更新