Swift 分支组合算子、平面映射和去Bounce奇异性 上下文
我遵循WWDC 2019 722和WWDC 2019 721中的示例,创建一个带有验证的字段,在该字段上运行异步网络检查 正如谈话中提到的,应该发生的是用户名字段应该:Swift 分支组合算子、平面映射和去Bounce奇异性 上下文,swift,combine,Swift,Combine,我遵循WWDC 2019 722和WWDC 2019 721中的示例,创建一个带有验证的字段,在该字段上运行异步网络检查 正如谈话中提到的,应该发生的是用户名字段应该: 去盎司 显示加载指示器 执行网络请求 以网络结果结束 隐藏加载指示器 以及显示或隐藏验证消息作为网络响应的结果 我有一个原型,它具有去抖动功能,并使用延迟操作符模拟网络请求。所有这些在很大程度上都很有效 a=$firstName .debounce(用于:。秒(0.5),调度程序:DispatchQueue.main) .fla
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阻止了它的工作,根据您的描述,这就是它听起来的样子。aJust
只产生一个输出。附加一个去抖动
不会去抖动任何东西。充其量,它只会将的输出延迟一段时间。最坏的情况是,有一个bug阻止了它的工作,根据您的描述,这听起来是这样的。我想知道这是否是因为发行商在去盎司期结束之前“完成”了。在关于Just
的文档中:“一个发布者只向每个订阅者发送一次输出,然后就完成了。”在我的示例中,我选择了使用throttle,但您所追求的几乎就是使用Combine-refs的示例代码:我想知道这是否是因为Just
发布者“完成了”在去盎司周期结束之前。在关于Just
的文档中:“向每个订阅者发送一次输出,然后完成的发布者。”我在示例中选择了使用throttle,但您所追求的几乎完全是使用Combine-refs:和的示例代码