我发现自己又回到了这篇文章,所以我觉得我应该对两者之间的区别添加一些额外的见解@Published
and CurrentValueSubject
.
一个主要区别可以在文档中找到@Published
:
当属性更改时,发布发生在属性的 willSet 块中,这意味着订阅者会在属性实际设置之前收到新值。
此外,关于斯威夫特论坛 https://forums.swift.org/t/is-this-a-bug-in-published/31292注意@Published
旨在与 SwiftUI 一起使用。
关于@Published
出版于willSet
块的属性,请考虑以下示例:
class PublishedModel {
@Published var number: Int = 0
}
let pModel = PublishedModel()
pModel.$number.sink { number in
print("Closure: \(number)")
print("Object: \(pModel.number) [read via closure]")
}
pModel.number = 1
print("Object: \(pModel.number) [read after assignment]")
这会产生以下输出:
Closure: 0
Object: 0 [read via closure]
Closure: 1
Object: 0 [read via closure]
Object: 1 [read after assignment]
将此与另一个示例进行对比,其中我们保持所有内容相同,除了替换@Published
with CurrentValueSubject
:
class CurrentValueSubjectModel {
var number: CurrentValueSubject<Int, Never> = .init(0)
}
let cvsModel = CurrentValueSubjectModel()
cvsModel.number.sink { number in
print("Closure: \(number)")
print("Object: \(cvsModel.number.value) [read via closure]")
}
cvsModel.number.send(1)
print("Object: \(cvsModel.number.value) [read after assignment]")
Output:
Closure: 0
Object: 0 [read via closure]
Closure: 1
Object: 1 [read via closure] // <— Here is the difference
Object: 1 [read after assignment]
更新后number
1、读取对象的CurrentValueSubject
的值属性within关闭打印新值而不是旧值@Published
.
总而言之,使用@Published
在你的ObservableObjects
用于您的 SwiftUI 视图。如果您希望创建某种具有保存当前值的实例属性的模型对象and还在设置后发布它的更改,使用CurrentValueSubject
.