Swift Joint 防止初始值触发接收器并同时防止重复?

zum*_*zum 6 ios swift combine

我有一个带有myStateBool 的模型,在控制器中我像这样沉入其中:

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

myState在 init 处初始化为false

@Published private(set) var myState:Bool = false
Run Code Online (Sandbox Code Playgroud)

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

所以,简而言之:

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

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

LuL*_*aGa 7

如果我理解正确,您期望第一个值使其下沉为true。在这种情况下,您只需交换dropFirst()即可removeDuplicates()

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