SwiftUI

(WWDC) 实践 Combine

2019-06-26  本文已影响10人  FicowShen



本篇为 初探 Combine 的续篇。

内容概览




Publisher & Subscriber

Publisher

Subscriber

Subscriber 的定义 接收订阅事件 接收值(0个或多个)产生事件 接收普通完成事件 接收带有错误的完成事件 Subscriber 的特点



不同的Subscribers

创建 Publisher 使用 map Operator 对输出进行转换 使用 tryMap Operator 解析输入值并输出解析后的模型 直接使用 decode Operator,操作更简洁高效




Failure Handling Operator

错误处理

使用 assertNoFailure Operator 当错误发生时,运行时错误会导致崩溃

失败处理 Operator



Catch



使用 catch Operator 需要返回一个备用的 Publisher

结构概览:

flatMap



结构分析:

使用 flatMap Operator flatMap Operator 中的子步骤 decode Operator 中发生错误 使用 catch Operator 从错误中恢复 flatMap Operator 将恢复后的结果向下传递

Before:

After:



将结果绑定到对象的属性上




Scheduled Operator

描述 在何时 和 在何处 执行
由 RunLoop 和 DispatchQueue 提供支持




Cancellation

内置于 Combine
提前结束订阅




Subject

可以表现为 Publisher, 也可以表现为 Subscriber
可以通过广播的方式向多个 subscribers 发送值


不同的 Subjects

CurrentValue 会保存结果,而 Passthrough 不会。

示例代码:




SwiftUI BindableObject

使用 SwiftUI

SwiftUI持有 Subscriber
你只需要给它提供 Publisher

SwiftUI BindableObject




集成 Combine

如何使用 Combine 实现以下需求呢?




@Published

属性包装器
可以添加 publisher 到任何属性上

使用示例:



先实现与密码输入框相关的工作:

使用 CombineLatest 结合两个 Publisher 的最新值:

使用 validatedPassword 即可订阅密码输入相关的事件:

请观察 validatedPassword 的类型,好像有点冗长!

假设某个密码一定是无效的:

简化 validatedPassword 的类型:

至此,与密码输入框相关的工作已完成。



下面进行与用户名输入框相关的工作:

debounce

使用 debounce 可以有效地减少重复请求的次数:

设置 debounce 的阈值为 0.5 秒,并且在 Main RunLoop 上调度执行:

除此之外,还需要请求网络来进行校验:

使用 flatMap :

单次网络请求,使用 Future 更适合:

完善请求的响应部分:

结构概览:

至此,与用户名输入框相关的工作已完成。


最后,进行与创建帐号按钮相关的工作。

结合用户名、密码相关的 Publisher :

绑定结果到按钮上:

至此,与创建帐号按钮相关的工作也完成了。

结构概览:


从现在开始使用 Combine




参考内容:
Combine in Practice




转载请注明出处,谢谢~

上一篇 下一篇

猜你喜欢

热点阅读