【问题标题】:Swift Combine Publish TwiceSwift 合并发布两次
【发布时间】:2020-09-01 22:50:01
【问题描述】:
class ObservableFormViewModel: ObservableObject {
@Published var isSubmitAllowed: Bool = true
@Published var username: String = ""
@Published var password: String = ""
var somethingElse: Int = 10
}
var form = ObservableFormViewModel()
let formSubscription = form.$isSubmitAllowed.sink { _ in
print("Form changed: \(form.isSubmitAllowed) \"\(form.username)\" \"\(form.password)\"")
}
form.isSubmitAllowed = false
form.isSubmitAllowed = false
form.isSubmitAllowed = false
输出是:
Form changed: true "" ""
Form changed: true "" ""
Form changed: false "" ""
Form changed: false "" ""
我的问题是:
- 为什么
true 输出为 2 而false 只有 2?
- 有更好的方法来删除重复项吗?
【问题讨论】:
标签:
swift
swiftui
combine
【解决方案1】:
为什么真正的输出是 2 而假的只有 2?
第一个输出在您创建 formSubscription 时运行。接下来的三个是由您连续的form.isSubmitAllowed = false 语句触发的。
请注意,您将form.isSubmitAllowed 三次更改为false,并且在输出中它只出现两次:
form.isSubmitAllowed = false
form.isSubmitAllowed = false
form.isSubmitAllowed = false
// Form changed: true "" ""
Form changed: true "" ""
Form changed: false "" ""
Form changed: false "" ""
这是因为您打印的不是更改后的值,而是旧值。
试试这个:
let formSubscription = form.$isSubmitAllowed.sink { isSubmitAllowed in
print("Form changed: \(isSubmitAllowed) \"\(form.username)\" \"\(form.password)\"")
}
打印出来:
// Form changed: true "" ""
Form changed: false "" ""
Form changed: false "" ""
Form changed: false "" ""
如果您想删除重复项,只需使用 removeDuplicates:
let formSubscription = form.$isSubmitAllowed.removeDuplicates().sink { value in
print("Form changed: \(value) \"\(form.username)\" \"\(form.password)\"")
}
form.isSubmitAllowed = false
form.isSubmitAllowed = false
form.isSubmitAllowed = false
打印出来:
Form changed: true "" ""
Form changed: false "" ""