Почему String.publisher не может быть запущен? - PullRequest
0 голосов
/ 10 марта 2020

Я выполняю свой код в Playground:

import PlaygroundSupport
import Combine

PlaygroundPage.current.needsIndefiniteExecution = true

var s = "a"
let sb = s.publisher
    .sink(receiveValue: {
        print("rec: \($0)")
    })

let s0 = Timer.publish(every: 1.0, on: .main, in: .common)
.autoconnect()
.sink(receiveValue: {_ in
    print("tiktok...")
    s.append("not work!")
})
s.append("not work too!")

Мой вопрос, почему s.publisher не может быть запущен, даже если я изменил значение s ???

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Проблема в том, что Array.Publisher просто генерирует все элементы массива и затем завершается. Он не ждет мутаций массива.

Если вы хотите выдавать значение каждый раз, когда String меняет его значение, вам нужно сохранить это String в class как @Published и подпишитесь на издателя Published свойства.

class StringPublisher: ObservableObject {
    @Published var value: String

    init(value: String) {
        self.value = value
    }
}

let s = StringPublisher(value: "a")
let sb = s.$value.sink(receiveValue: {
    print("rec: \($0)")
})

let s0 = Timer.publish(every: 1.0, on: .main, in: .common)
.autoconnect()
.sink(receiveValue: {_ in
    print("tiktok...")
    s.value.append("now work!")
})

s.value.append("now work too!")
0 голосов
/ 10 марта 2020

Ваш sb publisher испускает все свои значения и успешно завершается. Вот почему после добавления символов в исходную строку это не вызывает публикацию событий

...