RAC实践和注意事项

RAC:包括信号源、订阅者、调度器、清洁工

信号源:

RACSignal,代表未来将会被传送的值,他是一种push-driven流,RACSignal可以向订阅者发送三种不同类型的值:sendNext(正常信号)、error(错误)、completed(信号已经发送结束,不会再传给订阅者);

信号的发送都是通过-subscribe:这个方法来实现的,他也是信号和订阅者的唯一桥梁。

RACSubject,代表可以手动控制的信号,可以看做他是RACSinal的可变版本(类似数据和可变数据),因为它继承RACSinal所以可以当做信号,但它又实现了RACSubscriber协议,所以他还可以作为订阅者订阅其他信号。(它太灵活,所以正常情况下我们不用他,一般用它的双性性来处理 网络或其他 fail(错误逻辑))

充当两种角色实例:

RACSubject订阅了RACSignal,又被订阅者1、2、3订阅
统一处理错误逻辑实例


RACSequence:代表一个不可变的序列(和链表一样结构一样),它不可以直接被订阅,但它可以RACSingal随意的转换。他主要是用来处理OC中集合的,例如(遍历等)循环数组等。

注意:RACSequence中包含的值在默认情况下是懒计算的,即只有在真正用到的时候才会被计算,并且只会计算一次,如果我们只用到了一个RACSequence中的部分值的时候,它就在不知不觉中提高了我们应用的性能,(所以我们在使用时,要先看下我们需要的数据和后台返回给我们的数据,在去看是直接在获取数据时转换模型,还是用的使用转换模型)【性能优化问题】

处理集合实例

订阅者:所有实现RACSubscriber的类都可以作为订阅者

注意:一个订阅者可以订阅多个信号源的,而且他也可以随时取消任意一个订阅;

信号是可以转成订阅者的,只要遵守RACSubscriber协议就可以。

调度器:

扮演着调度器的角色,本质上,它就是用GCD的串行队列来实现的,并且支持取消操作

取消请求的例子

清洁工:

垃圾回收,这个是自动回收的,一般在信号订阅完成会自发进行的。


特殊的一个存在:事件控制器

RACCommand类用于表示事件的执行,一般来说是在UI上的某些动作来触发这些事件,比如点击一个按钮。RACCommand的实例能够决定是否可以被执行,这个特性能反应在UI上,而且它能确保在其不可用时不会被执行。通常,当一个命令可以执行时,会将它的属性allowsConcurrentExecution设置为它的默认值:NO,从而确保在这个命令已经正在执行的时候, 不会同时再执行新的操作。命令执行的返回值是一个RACSignal,因此我们能对该返回值进行next:,completed或error:,这在下文会有所展示。

RACCommand的基本使用

1.executionSignals:需要执行的block成功的时候返回的信号,他是在主线程执行的。

2.executing:判断当前的block是否在执行,执行完之后会返回@(NO).

3.enabled:当前命令是否enabled,默认是no,他也可以根据enableSignal来设置或者allowsConcurrentExecution设置为NO的时候(command已经开始执行)4.errors:执行command的时候获取的error都会通过这个信号发送5.allowsConcurrentExecution:是否允许并发执行command,默认是NO。6.initWithSignalBlock:(RACSignal * (^)(id input))signalBlock:初始化RACCommand,参数为返回一个信号的block,即block返回的是executionSignals

7.- (id)initWithEnabled:(RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(id input))signalBlock:第一个参数设置当前command是否可用,第二个是执行的block。enableed默认是yes,所以第二个参数也可以为nil。

8.execute:(id)input:调用command,input为executionSignals的订阅者发送的值


--------------------------完美分割线-------------------------------------------

RAC的三个作用:

1、数据绑定:这个特别是在cell赋值操作时,我们平常是直接懒加载赋值,有了RAC我们可以在声明对象时就可以直接进行数据绑定。

2、函数式编程:(利用block嵌套block,所有的操作都在一些列的操作中完成)

3、响应式编程:几乎把ios中的所有响应监听都统一化,耦合性非常低,监听的事情和相应的事情都可以在一起处理,不在需要相互的跳转。

其他方式也可以是实现MVVM,为什么要用这个方式:

1、模型转换上,可以直接用RACSequence直接处理,内部是懒加载实现的,有一定个的内存优化

2、错误统一处理上,我们可以通过RACSuject同意处理错误逻辑

3、逻辑处理上,通过信号统一管理数据,信号激活也是懒加载形式的,有一定的性能优化,在下拉刷新上也大大减少的代码量。

4、通过RACCommand进行管理,我们可以按需执行,实时检测执行状态,是否可以被执行等。

5、代码上的简洁,省去大量的if else  for等,也省去了很多的方法嵌套方法,所有的下一步事件都可以通过嵌套block来实现。


相应问题:

1、模型转换

RAC提供的模型转换是懒加载的(用数据中的哪一个才进行转换哪一个),我们要根据自己的需要看看是直接在数据源转换模型,还是在使用时在进行模型转换。

同样的数据直接用mj_的方法转换,耗时: 0.009762,用RAC自带的dictArr.rac_sequence map进行循环转换耗时: 0.012227,明显体现出mj_的

2、RAC优势:函数响应式框架

响应式编程:不需要考虑顺序,只需要知道结果,万物皆是流

函数式编程:把操作尽量写成一系列嵌套或方法调用,在ios中就是block中套block

3、数据绑定:

注意我们观察的是模型对象,并不是模型对象里面的某一个属性,这样是观察不到的。

注意事项:在绑定的时候我们可以在函数里添加filter、map、skip、、等方法,不需要在不断的进行循环或者if else了,非常的方便,也便于管理。

4、替换对象:代理、按钮事件、消息中心、KVO、KVC、监听文本框文字改变、等等,都可以通过流对象、订阅流、管理流、销毁流来处理,非常的耦合,不需要来回的相互跳转了。

5、用了RAC代码中少了相互跳转、少了if else、少了for循环、少了代理等等,都是代码的优化、少了方法和方法之间的调用,多了block的嵌套。

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

推荐阅读更多精彩内容