美文网首页
Combine -- 概述

Combine -- 概述

作者: jancywen | 来源:发表于2021-02-20 14:44 被阅读0次

    响应式异步编程的抽象和特点:

    异步操作在合适的时机发布事件,这些事件带有数据,使用一个或多个操作来处理这些事件以及内部的数据。在末端,使用一个订阅者来 “消化” 这个事件和数据,并进一步驱动程序的其他部分(比如 UI 界面) 的运行。上面这些对于事件和数据的操作,以及末端的订阅,都是在事件发生之前完成的。一开始我们就将这些设定好,之后它可以以预设的方式响应源源不断发生的事件流。

    Combine 中最重要的角色有三种:

    • 负责发布事件Publisher
    • 负责订阅事件Subscriber
    • 负责转换事件和数据Operator

    Publisher

    public protocol Publisher { 
      associatedtype Output 
      associatedtype Failure : Error 
      func receive<S>(subscriber: S) where 
        S : Subscriber, 
        Self.Failure == S.Failure, 
        Self.Output == S.Input 
    }
    

    Publisher 最主要的工作其实有两个:

    • 发布新的事件及其数据,
    • 准备好被Subscriber 订阅。

    Publisher 协议包括两个关联类型 (associatedtype) 以及一个 receive 方法:

    • Output 定义了某个 Publisher 所发布的值的类型,
    • Failure 则定义可能产生的错误的类型。

    Publisher 可以发布三种事件:

    1. 类型为 Output 的新值:这代表事件流中出现了新的值。
    2. 类型为 Failure 的错误:这代表事件流中发生了问题,事件流到此终止。
    3. 完成事件:表示事件流中所有的元素都已经发布结束,事件流到此终止。
      后两种事件在 Combine 中 则使用Subscribers.Completion 来描述,它是一个含有两个成员的 enum,其中成员类型为 .failure(Failure) 以及 .finished。

    Operator

    使用上游 Publisher 所发布的数据作为输入,以此产生的新的数据,然后自身成为新的 Publisher,并将这些新的数据作为输出,发布给下游。

    Subscriber

    public protocol Subscriber { 
        associatedtype Input 
        associatedtype Failure : Error 
    
        func receive(subscription: Subscription)
        func receive(_ input: Self.Input) -> Subscribers.Demand 
        func receive(completion: Subscribers.Completion<Self.Failure>) 
    }
    

    Subscriber 也是一个抽象的协议,它定义了某个类型想要成为订阅者角色时所需要满足的条件:定义中 Input 和 Failure 分别表示了订阅者能够接受的事件流数据类型和错误类型。想要订阅某个 Publisher,Subscriber 中的这两个类型必须与 Publisher 的 Output 和 Failure 相同。

    • sink 将响应函数式的 Publisher 链式代码,终结并桥接到基于闭包的指令式世界中来。
    • assign 接受一个 class 对象以及对象类型上的某个键路径 (key path)。每当 output 事件到来时,其中包含的值就将被设置到对应的属性上去

    Subject

    public protocol Subject : AnyObject, Publisher {
      func send(_ value: Self.Output)
      func send(completion: Subscribers.Completion<Self.Failure>) 
    }
    

    Subject 暴露了两个 send 方法,外部调用者可以通过这两个方法来主动地发布 output 值、failure 事件或 finished 事件。

    Combine 内置提供了两种常用的 Subject 类型,分别是 PassthroughSubjectCurrentValueSubject

    1.PassthroughSubject 简单地将 send 接收到的事件转发给下游的其他 Publisher 或 Subscriber

    1. CurrentValueSubject 则会包装和持有一个值,并在设置该值时发送事件并保留新的值。在订阅发生的瞬间,CurrentValueSubject 会把当前保存的值发送给订阅者。

    Scheduler

    如果说 Publisher 决定了发布怎样的 (what) 事件流的话,Scheduler 所要解决的就是两个问题:在什么地方 (where),以及在什么时候 (when) 来发布事件和执行代码
    receive(on:options:)delay(for:scheduler:)debounce(for:scheduler:) 所接受的参数包括一个 Scheduler 实例。它们负责更改时间或者线程相关的内容,是调用机制的管理者。

    相关文章

      网友评论

          本文标题:Combine -- 概述

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