如何解决与@Published属性
我正在与Swift5结合使用;我有一个CurrentValueSubject
与一个@Published
字典变量结合在一起。
问题在于,当更新当前值时,地图永远不会被调用!这是@Published
变量的一个具体问题,因为它可以与其他未使用@Published
的流一起使用。
@Published var userModels: [String: UserModel] = [:]
var chatModels: CurrentValueSubject<[ChatModelFirebase],Never> = CurrentValueSubject([])
chatModels
.combineLatest(userModels.publisher)
.map({ (chatModels,userModels) -> [ChatViewModel] in
print("Hello") // Never gets called! ?
return []
})
.assign(to: \.chatViewModels,on: self)
.store(in: &cancellableSet)
// Update chat model's value,and notice that map never gets called!
chatModels.values = []
没有错误,代码可以编译和运行,但是我从来没有得到流更新的结果。 如果我将userModels
也更新为CurrentValueSubject
,该问题将得到解决,但问题是为什么combineLatest(..)
却与@Published
冲突? >
解决方法
我认为您在两个发布者之间感到困惑:通过Published<Value>.Publisher
从@Published
属性创建的$userModels
发布者和从{{1 }}。
Publishers.Sequence
会发布每次更改的值。因此,userModels.publisher
将立即发布Published
值,然后在每次更改后再次发布:
$userModels
输出为:
[:]
class Foo {
@Published var dict: [String: Int] = [:]
}
let foo = Foo()
foo.$dict
.sink { print($0) }
foo.dict = ["one": 1,"two": 2]
发布者发布序列中的每个值,对于字典来说,序列是[:]
["one": 1,"two": 2]
的一系列元组。对于空序列,它不发布没有值:
Sequence
在您的情况下,您正在将(key,value)
与var dict: [String: Int] = [:]
dict.publisher
.sink { print($0) } // will not print anything
的发布者一起使用,该发布者来自空字典,该字典不发布任何值,因此.combineLatest
不发布任何值。
您可能正在寻找的是订阅Sequence
属性的CombineLatest
发布者:
Published
那么初始输出将立即是:
userModels
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。