我有一个型号,它有一个myStateBool,在控制器中,我是这样处理它的:

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个值更改时调用.因此,如果在已经为假的情况下在模型中将其设置为假,我不希望接收器调用.我可以通过.removeDuplicates()来实现这一点,但我仍然会收到初始的接收器调用.所以我加了.dropFirst().有了它,我没有得到初始的接收器调用,但是,当我第一次将myState设置为false(当已经为假)时,即使myState已经是假的,接收器也会被调用.

因此,简而言之:

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

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

推荐答案

如果我没有理解错的话,您预计第一个值会使其下降到true.在这种情况下,您只需交换dropFirst()removeDuplicates():

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

Ios相关问答推荐

StackView UIKit间距似乎非常小的编程式编程

第三方框架的iOS隐私声明

在TVOS中访问SWIFT中的objc++函数时发送给类的无法识别的 Select 符

SwiftData在获取值时应用程序崩溃:线程1:EXC_BREAKPOINT(代码=1,子代码=0x101e8303c)

BezierPath 中绘制图像形状轮廓的算法(Canny 边缘检测器)

swiftui 图像放大时无法正确拖动

在 iOS 上以后台模式安排任务(屏幕时间 API)

Swift/iOS:泛型错误:协议需要嵌套类型V;你想添加它吗?

Flutter firebase_auth 中的无效应用程序凭据/令牌不匹配

通过 Rosetta 打开模拟器 xcode 14 以修复滚动

iOS SwiftUI - 从以前的 struct 调用函数

警告:iPad:Icon-72.png:图标尺寸(0 x 0)

未找到签名证书​​iOS Distribution

使用 AVAudioPlayer 播放声音

如何判断是否为 64 位构建了静态库?

SLComposeViewController 分享教程

如何删除 Swift 数组中的所有 nil 元素?

UINavigationBar - 以编程方式设置标题?

AVAudioRecorder 抛出错误

如何进行键值观察并在 UIView 的框架上获取 KVO 回调?