我正在与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
冲突? >
答案 0 :(得分:1)
我认为您在两个发布者之间感到困惑:通过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