ios Swift合并防止初始值触发sink,同时防止重复?

kmbjn2e3  于 2022-11-19  发布在  iOS
关注(0)|答案(1)|浏览(158)

我有一个有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()实现这一点。但是我还是得到了初始的sink调用。所以我添加了.dropFirst()。在里面我没有得到初始的sink调用,但是,我第一次将myState设置为false(当已经为false时)时,即使myState已经为false,也会调用sink。
所以,简而言之:

  • 我只希望接收器在myStatefalse -> true或从true to false更改时触发
  • 我不希望在设置接收器时触发接收器(dropFirst()可以工作,但随后我会得到初始的重复边缘情况)。

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

tcomlyy6

tcomlyy61#

如果我没理解错的话,第一个使它下沉的值应该是true,如果是这样的话,只需交换一下dropFirst()removeDuplicates()

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

相关问题