【问题标题】:Swift Combine prevent initial value from triggering sink and prevent duplicates at the same time?Swift Combine 防止初始值触发接收器并同时防止重复?
【发布时间】:2022-11-16 06:22:47
【问题描述】:

我有一个模型,它有一个 myState Bool,在一个控制器中,我像这样沉迷于它:

model.$myState
.dropFirst()
.removeDuplicates()
.receive(on: RunLoop.main)
.sink { [weak self] myState in
    print("myState: \(myState)")
 }.store(in: &subs)

myState 在初始化时被初始化为 false

@Published private(set) var myState:Bool = false

我试图了解如何避免发生初始接收器触发。我只希望接收器在 myState 更改值时调用。因此,如果在模型中我将其设置为 false 时已经是 false,我不希望接收器调用。我可以通过 .removeDuplicates() 实现这一点,但我仍然收到初始接收器调用。然后我添加了.dropFirst()。有了这个,我没有得到初始的接收器调用,但是,我第一次将 myState 设置为 false(当已经为 false 时)调用接收器,即使 myState 已经是 false。

所以,简而言之:

  • 我只想在 myStatefalse -> truetrue to false 更改时触发接收器
  • 不希望在我设置接收器时触发接收器(dropFirst() 有效,但随后我得到了初始的重复边缘情况)。

如何设置接收器,使其仅在 myState 实际更改(切换)时触发,并且在设置时不获取初始接收器?

【问题讨论】:

    标签: ios swift combine


    【解决方案1】:

    使用 .scan 将当前传播的值与先前传播的值配对(作为元组)。然后,您可以在后续运算符中决定如何处理元组,仅当该值由两个不同的值组成时才让该值沿管道向下处理。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2017-04-26
    相关资源
    最近更新 更多