美文网首页iOS 进阶开发
RAC(ReactiveCocoa)——基本使用(附简单Demo

RAC(ReactiveCocoa)——基本使用(附简单Demo

作者: 炸街程序猿 | 来源:发表于2019-05-16 10:18 被阅读13次

     最近接触学习到了RAC(ReactiveCocoa),RAC是函数式+响应式编程结合,首先得去理解何为响应式函数编程(FRP)。

        看了许多介绍,举一个最通俗易懂的例子——在命令式编程环境中, a = b+c表示将表达式的结果赋给 a,而之后改变 b 或 c的值不会影响 a。但在响应式编程中,a的值会随着 b或 c的更新而更新,意味着声明了一种绑定关系,b、c的变化会直接影响到a。

        之前在iOS工作中,类之间的传值,无非就是block、delegate代理、KVO、notification这几种方法。在RAC中,同样具备替代KVO、delegate代理、通知、UI target、计时器timer、数据结构等各种方法。依据响应式函数编程,RAC方法本身更加简洁明了,通过提供信号的方式(RACSignal)可以捕捉当前以及未来的属性值变化,而且无需持续观察和更新代码。可直接在block中将逻辑代码加入其中,使得代码紧凑,更加直观。

        先来介绍ObjC版本,使用cocoaPods在podfile中添加 pod 'ReactiveObjC', '~> 3.1.0' ,然后pod install一下。在项目中#import <ReactiveObjC.h>,建议放入pch头文件中。

        通过RAC提供的方法与系统提供的方法分别进行对比,先来感受下RAC的强大之处。

    1. UIButton

    通过默认的Target-action创建点击动作

    RAC创建Button点击事件与添加点击手势动作

    在RAC的block代码块中,打印x的属性为当前self.testButton的相关信息。

    2. KVO

    KVO在使用时,必须在- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context中实现针对KVO监听属性值变化的处理,而且对于KeyPath书写容易产生手写错误。在对应类dealloc时,KVO还必须要进行remove操作,否则会程序crash

    使用KVO监听UILable的text属性变化

    在使用RAC代替KVO时,不仅能大大增加代码可读性,而且RACObserve(<#TARGET#>, <#KEYPATH#>)宏定义中keyPath可以代码提示出target中的属性成员变量,降低手写代码错误的可能性。

    使用RAC代替KVO监听属性变化

    3. delegate代理

    以UITextField为例,当需要对UITextField逻辑处理时,往往需要实现其各类代理方法,大大增加了代码量。当使用RAC之后

    使用RAC代替delegate实现方法

    @selector方法选择器中键入要实现的代理方法,代理名称声明为对应的代理名称。block代码块中,当触发监听的代理方法时返回元组类型数据,与swift中的元组类型有所区别,此处的元组看起来更像是数组。

    打印结果

    4. Notification通知

    RAC通知使用

    RAC会将通知名以及userInfo相关信息返回至block中

    5. 定时器timer

    6. 数组与字典

    遍历元素

    RAC遍历字典、数组中的元素

    RAC基本使用方法与流程

    RAC基本使用方法与流程

        以上代码中,subscribeNext作用为订阅信号,可在该block中输入逻辑相关代码块。但当多个对象的逻辑存在于block中需要修改时,仅仅subscribeNext已不能满足需求。

    RAC中信号的其它动作:

    信号映射:map、flattenMap

    信号过滤:filter、ignore、distinctUntilChanged

    信号合并:combineLatest、reduce、merge、zipWith

    信号连接:concat、then

    信号操作时间:timeout、interval、dely

    信号跳过:skip

    信号取值:take、takeLast、takeUntil

    信号发送顺序:donext、cocompleted

    获取信号中的信号:switchToLatest

    信号错误重试:retry

        在实际开发过程中,需要在RAC代码块中添加逻辑代码,避免不了引用当前类中的成员变量,那么需要在RAC方法外部写入以下代码:

    @weakify(self)

        在RAC的block代码块内部写入:

    @strongify(self)

    以此来避免出现block的循环引用,至于为何要如此声明,稍后会在后续文章中一一说明。

    稍后会在后续的文章里继续介绍如何使用,以及RAC信号流程原理。demo代码放到GitHub上demo链接

    作者:我只不过是出来写写代码

    链接:https://www.jianshu.com/p/74f1ea777017

    来源:简书

    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    相关文章

      网友评论

        本文标题:RAC(ReactiveCocoa)——基本使用(附简单Demo

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