本篇为 初探 Combine 的续篇。
内容概览
- Publisher & Subscriber
- Failure Handling Operator
- Scheduled Operator
- Cancellation
- Subject
- SwiftUI BindableObject
- 集成 Combine
Publisher & Subscriber
Publisher
- 事件流的源头
- Operators 从现有的 publishers 产生新的 publishers
- 随着时间产生强类型的值或错误
- 可以同步,也可以异步
- 可以附加兼容的 Subscribers
Subscriber






不同的Subscribers
- Key Path 赋值
- Sinks
- Subjects
- SwiftUI




Failure Handling Operator
错误处理
- Publisher 描述如何失败
- 由 Operator 来响应/恢复错误


失败处理 Operator
- assertNoFailure
- retry
- catch
- mapError
- setFailureType
Catch




结构概览:

flatMap

结构分析:






Before:

After:


Scheduled Operator
描述 在何时 和 在何处 执行
由 RunLoop 和 DispatchQueue 提供支持
- delay
- debounce
- throttle
- receive(on:)
- subscribe(on:)

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 的阈值为 0.5 秒,并且在 Main RunLoop 上调度执行:

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

使用 flatMap :

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

完善请求的响应部分:

结构概览:

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

最后,进行与创建帐号按钮相关的工作。
结合用户名、密码相关的 Publisher :

绑定结果到按钮上:

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

结构概览:

从现在开始使用 Combine
- 将小部件组合成 publishers
- 逐步采用
- 使用 @Published 为属性添加 Publisher
- 使用 Future 组合闭包和 Publisher
参考内容:
Combine in Practice
转载请注明出处,谢谢~