与@Published属性

时间:2020-08-18 20:14:59

标签: ios swift swift5 combine

我正在与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冲突?

1 个答案:

答案 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