Swift 分支组合算子、平面映射和去Bounce奇异性 上下文

Swift 分支组合算子、平面映射和去Bounce奇异性 上下文,swift,combine,Swift,Combine,我遵循WWDC 2019 722和WWDC 2019 721中的示例,创建一个带有验证的字段,在该字段上运行异步网络检查 正如谈话中提到的,应该发生的是用户名字段应该: 去盎司 显示加载指示器 执行网络请求 以网络结果结束 隐藏加载指示器 以及显示或隐藏验证消息作为网络响应的结果 我有一个原型,它具有去抖动功能,并使用延迟操作符模拟网络请求。所有这些在很大程度上都很有效 a=$firstName .debounce(用于:。秒(0.5),调度程序:DispatchQueue.main) .fla

我遵循WWDC 2019 722和WWDC 2019 721中的示例,创建一个带有验证的字段,在该字段上运行异步网络检查

正如谈话中提到的,应该发生的是用户名字段应该:

  • 去盎司
  • 显示加载指示器
  • 执行网络请求
  • 以网络结果结束
  • 隐藏加载指示器
  • 以及显示或隐藏验证消息作为网络响应的结果
  • 我有一个原型,它具有去抖动功能,并使用延迟操作符模拟网络请求。所有这些在很大程度上都很有效

    a=$firstName
    .debounce(用于:。秒(0.5),调度程序:DispatchQueue.main)
    .flatMap{name->AnyPublisher中的
    如果名称=“”{
    仅返回(名称)
    .删除任何发布者()
    }否则{
    仅返回(名称)
    .handleEvents(receiveOutput:{in self.isFirstNameLoading=true})
    .延迟(时间:。秒(2),计划程序:DispatchQueue.main)
    .handleEvents(receiveOutput:{in self.isFirstNameLoading=false})
    .删除任何发布者()
    }
    }
    .map{name->Bool in name!=“Q”}
    .assign(收件人:\.isFirstNameValid,在:self上)
    
    解盎司将等待输入暂停。
    flatMap
    在运算符的组合流中充当条件分支:如果值为空,则不必处理网络请求;否则,如果该值在解盎司后具有值,则执行网络请求。最后,我的例子是,出于模拟目的,“Q”总是一个错误

    然而,一个小问题是,去盎司发生在分支之前。我想把去Bounce移到条件的else分支,就像这样

    a=$firstName
    .flatMap{name->AnyPublisher中的
    如果名称=“”{
    仅返回(名称)
    .删除任何发布者()
    }否则{
    仅返回(名称)
    .debounce(用于:。秒(0.5),调度程序:DispatchQueue.main)
    .handleEvents(receiveOutput:{in self.isFirstNameLoading=true})
    .延迟(时间:。秒(2),计划程序:DispatchQueue.main)
    .handleEvents(receiveOutput:{in self.isFirstNameLoading=false})
    .删除任何发布者()
    }
    }
    .map{name->Bool in name!=“Q”}
    .assign(收件人:\.isFirstNameValid,在:self上)
    
    发生这种情况时,条件(空输入)的真正分支将正确运行,并且在flatMap之后的map+assign将正确运行。但是,当输入有值,并且条件的else分支运行时,在解盎司之后将不会运行任何内容

    我已尝试将
    DispatchQueue
    切换到
    OperationQueue.main
    RunLoop.main
    ,但无效

    在条件生效之前保持去Bounce现在还可以,但是我想知道我把它放在分支中的尝试是否做错了什么。我还想知道这是否是使用Combine在操作符中进行“分支”的正确方法,特别是使用
    flatMap
    Just()


    任何帮助都将不胜感激

    A
    Just
    只产生一个输出。附加一个
    去抖动
    不会去抖动任何东西。充其量,它只会将
    的输出延迟一段时间。最坏的情况是,有一个bug阻止了它的工作,根据您的描述,这就是它听起来的样子。

    a
    Just
    只产生一个输出。附加一个
    去抖动
    不会去抖动任何东西。充其量,它只会将
    的输出延迟一段时间。最坏的情况是,有一个bug阻止了它的工作,根据您的描述,这听起来是这样的。

    我想知道这是否是因为
    发行商在去盎司期结束之前“完成”了。在关于
    Just
    的文档中:“一个发布者只向每个订阅者发送一次输出,然后就完成了。”在我的示例中,我选择了使用throttle,但您所追求的几乎就是使用Combine-refs的示例代码:我想知道这是否是因为
    Just
    发布者“完成了”在去盎司周期结束之前。在关于
    Just
    的文档中:“向每个订阅者发送一次输出,然后完成的发布者。”我在示例中选择了使用throttle,但您所追求的几乎完全是使用Combine-refs:和的示例代码