美文网首页SwiftUI
(WWDC) 实践 Combine

(WWDC) 实践 Combine

作者: FicowShen | 来源:发表于2019-06-26 14:12 被阅读10次



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

        本文链接:https://www.haomeiwen.com/subject/xgrccctx.html