(WWDC) 实践 Combine



本篇为 初探 Combine 的续篇。


内容概览

  • Publisher & Subscriber
  • Failure Handling Operator
  • Scheduled Operator
  • Cancellation
  • Subject
  • SwiftUI BindableObject
  • 集成 Combine





Publisher & Subscriber


Publisher

  • 事件流的源头
  • Operators 从现有的 publishers 产生新的 publishers
  • 随着时间产生强类型的值或错误
  • 可以同步,也可以异步
  • 可以附加兼容的 Subscribers


Subscriber

1306450-4d8e065597102527.png
Subscriber 的定义
1306450-0efbdae23376df50.png
接收订阅事件
1306450-6f7513878b287320.png
接收值(0个或多个)产生事件
1306450-8b3a0c95ddf91692.png
接收普通完成事件
1306450-2394be6d92ece56a.png
接收带有错误的完成事件
1306450-6158c0e8d4a86b94.png
Subscriber 的特点



不同的Subscribers

  • Key Path 赋值
  • Sinks
  • Subjects
  • SwiftUI


1306450-06c6a7b21c9aef3b.png
创建 Publisher
1306450-ebb8964ebbb22924.png
使用 map Operator 对输出进行转换
1306450-7ed9dced9fb142cd.png
使用 tryMap Operator 解析输入值并输出解析后的模型
1306450-647a9c04ff432372.png
直接使用 decode Operator,操作更简洁高效





Failure Handling Operator


错误处理

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


1306450-c13dec700715fba5.png
使用 assertNoFailure Operator
1306450-4cf149ba2bfca3ff.png
当错误发生时,运行时错误会导致崩溃


失败处理 Operator

  • assertNoFailure
  • retry
  • catch
  • mapError
  • setFailureType



Catch

1306450-80d76e0f8da62015.png

1306450-881a6bc6f43d0aa9.png

1306450-bc1270d53c1a1548.png
1306450-88ddb1dd807c8bee.png
使用 catch Operator 需要返回一个备用的 Publisher


结构概览:

1306450-75a9bec56b1f6167.png


flatMap

1306450-eaec33685a73e189.png



结构分析:

1306450-d51f23c91f715bec.png
使用 flatMap Operator


1306450-7c2b076e0e3a9459.png
flatMap Operator 中的子步骤
1306450-f7d7f0cd9c18571e.png
decode Operator 中发生错误
1306450-30be472ce2c437a7.png
使用 catch Operator 从错误中恢复
1306450-0ad26631ae1cf89b.png
1306450-d0a037aa9035e6f3.png
flatMap Operator 将恢复后的结果向下传递


Before:

1306450-bf39d7c5d4dfed39.png

After:

1306450-ce2d2d6b1e0872f3.png



1306450-ddc60abc57d167a8.png
将结果绑定到对象的属性上





Scheduled Operator

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

  • delay
  • debounce
  • throttle
  • receive(on:)
  • subscribe(on:)


1306450-bc611b86c76a5531.png





Cancellation

内置于 Combine
提前结束订阅


1306450-17ce4d7e46aa6acb.png
1306450-3edd3e649bad9c28.png





Subject

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


1306450-1ed59cd815b4907a.png
1306450-cc25f5f31a40dc4c.png
1306450-0931f01ba93c5568.png
1306450-517e31c614afa8f8.png



不同的 Subjects

1306450-43e9795c593d9833.png
1306450-3189cc4bd99dcfe4.png
1306450-c5ef82be051d35a4.png

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


示例代码:

1306450-f56ed7bdb4543faa.png





SwiftUI BindableObject


使用 SwiftUI

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


SwiftUI BindableObject

1306450-eb3c1f8c107016e5.png
1306450-e951d984707fe4cd.png





集成 Combine


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

1306450-da6c7d1ed28c2a69.png




1306450-7a230851f66c38e1.png
1306450-90e1570565fb1df7.png
1306450-143c7a78c0e11c6d.png



@Published

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


使用示例:

1306450-bb831c9cdedf0ce0.png



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

1306450-f7eeafcd8325ec15.png

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

1306450-9c587bf51e100e85.png

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

1306450-634f0c280256ce95.png

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

1306450-7d2657fc18cb0d8a.png

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

1306450-adcf0cdaa605b188.png

简化 validatedPassword 的类型:

1306450-591df2b74708a2fa.png

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

1306450-dd5730681929f431.png




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

1306450-6ce1ccac341edeb5.png
1306450-a263aa478d715dae.png
debounce

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

1306450-445123f04273fbf6.png

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

1306450-f22df001b69ac265.png

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

1306450-3d48884a299b70a7.png

使用 flatMap :

1306450-19a4f37721be7e51.png

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

1306450-89265a95040e20aa.png

完善请求的响应部分:

1306450-2ec26a7c5f2ca8b8.png


结构概览:

1306450-98cc181cd5d401da.png

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

1306450-a413e499ccaa196b.png



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


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

1306450-c795359ccd32c7f8.png

绑定结果到按钮上:

1306450-9e6f6aec415d196b.png

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

1306450-547a45e5fa928fbd.png

结构概览:

1306450-a7ef799b2494aa02.png



从现在开始使用 Combine

  • 将小部件组合成 publishers
  • 逐步采用
  • 使用 @Published 为属性添加 Publisher
  • 使用 Future 组合闭包和 Publisher





参考内容:
Combine in Practice




转载请注明出处,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值