本篇为 初探 Combine 的续篇。
内容概览
- Publisher & Subscriber
- Failure Handling Operator
- Scheduled Operator
- Cancellation
- Subject
- SwiftUI BindableObject
- 集成 Combine
Publisher & Subscriber
Publisher
- 事件流的源头
- Operators 从现有的 publishers 产生新的 publishers
- 随着时间产生强类型的值或错误
- 可以同步,也可以异步
- 可以附加兼容的 Subscribers
Subscriber
Subscriber 的定义 接收订阅事件 接收值(0个或多个)产生事件 接收普通完成事件 接收带有错误的完成事件 Subscriber 的特点
不同的Subscribers
- Key Path 赋值
- Sinks
- Subjects
- SwiftUI
Failure Handling Operator
错误处理
- Publisher 描述如何失败
- 由 Operator 来响应/恢复错误
失败处理 Operator
- assertNoFailure
- retry
- catch
- mapError
- setFailureType
Catch
使用 catch Operator 需要返回一个备用的 Publisher
结构概览:
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 可以有效地减少重复请求的次数:
设置 debounce 的阈值为 0.5 秒,并且在 Main RunLoop 上调度执行:
除此之外,还需要请求网络来进行校验:
使用 flatMap :
单次网络请求,使用 Future 更适合:
完善请求的响应部分:
结构概览:
至此,与用户名输入框相关的工作已完成。
最后,进行与创建帐号按钮相关的工作。
结合用户名、密码相关的 Publisher :
绑定结果到按钮上:
至此,与创建帐号按钮相关的工作也完成了。
结构概览:
从现在开始使用 Combine
- 将小部件组合成 publishers
- 逐步采用
- 使用 @Published 为属性添加 Publisher
- 使用 Future 组合闭包和 Publisher
参考内容:
Combine in Practice
转载请注明出处,谢谢~
网友评论