Combine -- 概述

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

异步操作在合适的时机发布事件,这些事件带有数据,使用一个或多个操作来处理这些事件以及内部的数据。在末端,使用一个订阅者来 “消化” 这个事件和数据,并进一步驱动程序的其他部分(比如 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 实例。它们负责更改时间或者线程相关的内容,是调用机制的管理者。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 如果有RxSwift的学习经验那么理解combine会更加迅速 通过对事件处理的操作进行组合 (combine) ...
    微笑_d797阅读 3,706评论 0 1
  • 简介 Combine是Apple在2019年WWDC上推出的一个新框架。该框架提供了一个声明性的Swift API...
    云天涯丶阅读 24,403评论 5 22
  • SwiftUI 与 Combine(简介)什么是SwiftUI?什么是Combine?响应式编程:异步编程:何时可...
    DkJone阅读 7,031评论 0 4
  • 在具体介绍 Combine 之前,有两个重要的概念需要简要介绍一下: 观察者模式 响应式编程 观察者模式 观察者模...
    没八阿哥的程序阅读 8,950评论 2 21
  • Publisher 根据 Subscriber 的请求提供数据。如果没有任何订阅请求,Publisher 不会提供...
    YungFan阅读 600评论 0 1