(WWDC) 实践 Combine



本篇为 初探 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


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





Failure Handling Operator


错误处理

  • Publisher 描述如何失败
  • 由 Operator 来响应/恢复错误


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


失败处理 Operator

  • assertNoFailure
  • retry
  • catch
  • mapError
  • setFailureType



Catch



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


结构概览:


flatMap



结构分析:

使用 flatMap Operator


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


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




转载请注明出处,谢谢~

你可能感兴趣的:((WWDC) 实践 Combine)