【问题标题】: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 "" ""
    

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 2020-03-24
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      相关资源
      最近更新 更多