为什么String.publisher触发不了?
Why String.publisher can't be triggered?
我在 Playground 中执行我的代码:
import PlaygroundSupport
import Combine
PlaygroundPage.current.needsIndefiniteExecution = true
var s = "a"
let sb = s.publisher
.sink(receiveValue: {
print("rec: \([=11=])")
})
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值后s.publisher无法触发???
您的 sb publisher
发出所有值并成功完成。这就是为什么在将字符附加到您的初始字符串后,它不会触发发布事件
问题是 Array.Publisher
只是发出数组的所有元素然后完成。它不等待数组的变化。
如果您想在每次 String
更改其值时发出一个值,您需要将 String
作为 @Published
存储在 class
中并订阅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: \([=10=])")
})
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!")
我在 Playground 中执行我的代码:
import PlaygroundSupport
import Combine
PlaygroundPage.current.needsIndefiniteExecution = true
var s = "a"
let sb = s.publisher
.sink(receiveValue: {
print("rec: \([=11=])")
})
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值后s.publisher无法触发???
您的 sb publisher
发出所有值并成功完成。这就是为什么在将字符附加到您的初始字符串后,它不会触发发布事件
问题是 Array.Publisher
只是发出数组的所有元素然后完成。它不等待数组的变化。
如果您想在每次 String
更改其值时发出一个值,您需要将 String
作为 @Published
存储在 class
中并订阅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: \([=10=])")
})
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!")