Day15 Combine 02 - Publisher

Publisher

在Combine 中,Publisher 是观察者模式中的Observable,并且可以通过组合变换(利用Operator)重新生成新的Publisher

主要功能是提供数据,不论是被动请求或是主动提供,有两个 OutputFailure 关联类型属性,Output代表数据流中输出的值,值的更新可能是同步,也可能是异步,Failure代表可能产生的错误,也就是说Pubslier 最核心的是定义了要发布的值与可能的错误。Publisher 通过receive(subscriber:)接口来接受订阅,而Subscriber 订阅者的 InputFailure关联类型属性必须与 Publisher 声明的 OutputFailure 类型相匹配来保证类型安全

以下举一些常见的Publisher 例子:

  1. Just

    struct Just<Output>

    会给每个订阅者发送一个消息,然後立即结束(这个数据流只包含一个值)

    let justPubliser = Just("Hello")
    
  2. Future

    typealias Future<Output, Failure>.Promise = (Result<Output, Failure>) -> Void

    Future是一个专门处理异步函数的Publisher,Future 初始化需要提供执行具体操作的closure,这个操作可以是异步的,并且最终返回一个Result,所以Future只有两种结果:

    1. 发送一个值,然後正常结束
    2. 因错误而终止

    在将一些异步操作转换为Publisher 时非常有用,像是网络请求等等

    let futurePubliser = Future<Int, Never> { promise in
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            promise(.success(1))
        }
    }
    
  3. Deferred

    Deferred 初始化需要提供一个生成Publisher 的closure,只有在有Subscriber 订阅的时候才会生成指定的Publisher,也就是当收到订阅後才建立Publisher

    let deferredPublisher = Deferred {
        return Future<Bool, Error> { promise in
            DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                return promise(.success(true))
            }
        }
    }
    

    Future不管有没有订阅者都会立刻执行,而Deferred只有当收到订阅後才会初始化


<<:  Day15 开发套件 - 实作MethodChannel

>>:  SQL 语言和你 SAY HELLO!!

学习Python纪录Day24 - 建立Excel及编辑试算表

新增工作表 使用create_sheet()方法新增工作表,title参数为工作表名称 wb = l...

矛盾睡眠的断面

回到家以後,沉睡又再沉睡的时间大量发生。 平常没有休息的部分,直接从所有内里涌现出来。 即使是平常很...

帆船与海

大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...

新手应该要学什麽程序语言?

Photo by Victoriano Izquierdo on Unsplash 文章同步发布於...

抽象类别与介面 (1)

在上一篇文章中提到,我们可以将不同类别当中的共同属性或方法,提取出来放在 parent 类别当中,然...