ReactiveCocoa 4 文档翻译:设计指南(二):信号的规范

原文 :Design Guidelines

我翻译的RAC4的文档:
ReactiveCocoa 4 官方文档翻译
ReactiveCocoa 4 文档翻译:基本操作符(一)
ReactiveCocoa 4 文档翻译:基本操作符(二)
ReactiveCocoa 4 文档翻译:框架组成介绍
ReactiveCocoa 4 文档翻译:兼容Objective-C
ReactiveCocoa 4 文档翻译:设计指南(一):事件的规范
ReactiveCocoa 4 文档翻译:设计指南(二):信号的规范
[翻译]ReactiveCocoa 4 最佳实践

Signal的规范

一个信号是始终打开的流,流按照事件的规范。(ReactiveCocoa 4 文档翻译--设计指南(一):事件的规范

信号是一个引用类型。因为每个信号都有自己的身份,换句话说,每个信号都有自己的生命周期,最终通常会终止。一旦被终止,信号不能被重启。

信号一被实例化就开始工作

<code>Signal.init</code>立即就会执行传递过来的闭包。意味着副作用可能在初始化器返回前就发生。

也可能在初始化器返回前就发送事件。然而,因为这个时候任何观察者都不能被添加,这个时候发出的事件都是不会被接收到。

观察一个信号不会有副作用

当一个信号的观察者被添加或者被移除时,和信号关联的操作不会被启动或者停止。所以观察方法不会有副作用。

一个信号的副作用只能通过一个终结事件来停止。

同一个信号的所有观察者同时按照相同顺序接收到事件

因为观察行为不会有副作用,一个信号不会为不同的观察者自定义不同的事件。
当一个事件从信号发出时,它会被同步的分发给所有观察者,这个机制和NSNotificationCenter发送通知有点像。

换句话说,不存在不同的观察者对应不同的事件流。所有的观察者看到的都是同一个事件流。

这条规则只有一种意外情况:在一个信号终止后添加一个观察者会产生一个Interrupted事件发送给这个观察者。

信号会一直被保持直到所有观察者都被释放

即使信号源(caller)不再有一个指针指向信号(does not maintain a reference):

  • <code>Signal.init</code>创建的信号会一直存在直到生成器闭包(generator closure)释放了作为参数的观察者
  • <code>Signal.pipe</code>创建的信号会一直存在直到它返回的观察者被释放

这保证了和信号关联的长耗时的工作不会被提前销毁。

注意一下,可以在收到终结事件收到前提前释放信号。但是应该避免这么做,这会导致内存泄露,但是有时为了让终结不可用会这么做。

终止事件清除信号相关的资源

当一个终结事件从信号发出,所有的观察者都会被释放,所有用于产生事件的资源都应该被清除。

最简单的保证正确的清楚资源是利用生成器闭包(generator closure)返回的disposable,当终止发生时它会被处理。disposable要负责释放资源,关闭文件句柄,取消网络请求,或者其他任何和工作想关联的东西。(disposable的内容可以查看:ReactiveCocoa 4 文档翻译:框架组成介绍

SignalProducer的规范

一个信号生产者(signal producer)就像一份创造信号的食谱。信号生产者不会自己开始工作,在生成一个信号后开始工作。

信号生产者就是一份声明怎么创建信号,是值类型,所以没有内存管理的事情要担心。

信号生成者根据创建信号的要求开始工作

<code> start </code>和 <code> startWithSignal </code>方法会都会生成一个信号(隐式和显式)。在初始化信号后,传递给<code> SignalProducer.init </code>的闭包会被执行,在有观察者添加后开启事件流。

虽然生产者自己不负责工作的执行,但是我们也会说“starting”和“canceling” 一个生产者。这两个词指产生一个要开始工作的信号,和释放那个信号以停止工作。

一个生产者可以被开始很多次,相关联的工作也会被执行同样多次。

每个生产的信号可能在不同的时间发送不同的事件

因为信号生产者根据需要开始工作,所以可能每次执行相关的观察者会不同,这些观察者可能接收到完全不同的事件顺序。

换句话说,每次生产者启动后生成的事件可能完全不同或者顺序完全不同。

尽管如此,每个信号生产者的每次执行后会按照事件的规范。(ReactiveCocoa 4 文档翻译:设计指南(一):事件的规范

信号的操作符可以在迁移后使用在信号生产者上

因为信号和信号生产者的紧密关系,利用<code> lift </code>方法将使用在信号上的操作符向上迁移就可以使用在信号生产者上。

<code> lift </code>会将这个操作符的行为使用在每个信号生成者启动后产生的信号上。

释放一个生产的信号会中断(interrupt)它

当一个信号生产者通过 <code> start </code>or <code> startWithSignal </code>方法启动, 一个 <code> Disposable </code>会被自动创建并且传回。

释放它会中断信号生产者,从而取消未执行的工作并且发送一个Interrupted事件给所有观察者,也会释放所有在<code> SignalProducer.init </code>时被添加进<code> CompositeDisposable </code>的东西。
注意释放一个生产的信号不会影响到其他有这个信号生产者产生的信号。

欢迎关注我的微博:@没故事的卓同学

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

推荐阅读更多精彩内容