Swift Combine如何防止初始值触发`sink`并同时防止重复?

5

我有一个模型,其中有一个名为myState的布尔值,在控制器中,我像这样连接到它:

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 -> true或从true to false时调用下沉。
  • 不想在设置下沉时触发下沉(dropFirst()可行,但会有初始重复的边缘情况)。
如何设置下沉,使其仅在myState实际更改(切换)时触发,并且在设置时不获取初始下沉?
1个回答

6

如果我理解正确的话,您希望第一个值为 true 时将其删除。如果是这种情况,您只需互换 dropFirst()removeDuplicates() 的位置:

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

现在有意义了。是的,这正是我做错的地方。removeDuplicates需要放在dropFirst之前。谢谢。 - zumzum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接