- ReactiveCocoa简介
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架。
在iOS开发过程中,经常会响应某些事件来处理某些业务逻辑,例如按钮的点击,上下拉刷新,网络请求,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation)。但是这些事件都用不同的方式来处理,比如action、delegate、KVO、callback等。 这些我们都可以使用RAC来做到。
- RAC的思想
RAC主要应用函数响应式编程思想,被描述为函数响应式编程(FRP)框架。即FRP:Function Programing (函数式编程) And Reactive Programing(响应式编程)
函数式编程思想本质:往方法中传入block,方法中嵌套block调用,把代码聚合起来管理。
所谓的响应式编程思想就是不需要考虑调用顺序,只需要考虑结果,类似蝴蝶效应,产生一个事件,会影响很多东西,这些事件会像留一样传播出去,典型的代表是KVO。
-
RAC常见类
-
RAC常见类-RACSiganl
RACSiganl实现图解
2.RAC常见类-RACSubject
RACSubject实现图解
3.RAC常见类-RACReplaySubject
总结分析
RACSignal:每次订阅都会完整的执行didSubscriber方法。重新调用新的nextBlock()
RACSubject:只能接收到订阅后发送的消息。订阅前的信号无法正常接收
RACReplaySubject:调用sendNext()的时候会自动把值保存起来。同时每次订阅会把nextBlock保存起来。每次订阅会根据保存的值遍历调用保存的nextBlock。(此方法在ViewModel进行数据请求的使用中比较方便)
4.RAC常见类-RACDisposable
5.RAC常见类-RACSequence
** **开发中可以快速高效的遍历数组和字典、字典转模型
6.RAC常见类-RACCommand
RACCommand类用于响应动作事件的执行,执行命令通常由用户交互页面的手势操作来触发。该类可以实现多种不同情况下的响应事件处理,除了可以快速绑定交互页面,还可以确保其在未使用时不会执行信号操作。
在实际项目开发中,RACCommand使用的场景多用于交互手势操作响应事件,以及网络请求时不同请求状态的处理封装处理。当需要响应事件或网络请求时,直接执行对应RACCommand就可以发送信号,执行操作。当RACCommand内部收到请求时,把处理的结果返回给外部,这时要通过signalBlock返回的信号进行数据传递。
7.RAC常见类-RACMulticastConnection
- RAC一些常见用法
1.代替代理: rac_signalForSelector:用于替代代理
2.代替KVO: rac_observeKeyPath: 和 rac_valuesForKeyPath:
3. 监听事件: rac_signalForControlEvents:用于监听某个事件
4.代替通知 注意 rac_addObserverForName:用于监听某个通知。并且改方法内部实现了通知销毁的机制,不用每次在dealloc中写销毁通知的方法
5.监听文本框文字改变: rac_textSignal:只要文本框发出改变就会发出这个信号。
- RAC常见高级操作
1.RAC过滤
1.skip
skip传入2 跳过前面两个值
实际用处: 在实际开发中比如 后台返回的数据前面几个没用,我们想跳跃过去,便可以用skip
2.take
可以屏蔽一些值,取面几个值—这里take为2 则只拿到前两个值
3.takeLast
和take的用法一样,不过他取的是最后的几个值,如下,则取的是最后两个值
4.distinctUntilChanged
如果当前的值跟上一次的值一样,就不会被订阅到
5. ignore:忽略一些值
6. filter 返回值 就是过滤条件。只有满足这个条件才能获取到内容
2.RAC映射
3.RAC组合
1.combineLatest
reduce里的参数一定要和combineLatest数组里的一一对应. Block:只要源信号发送内容,就会调用,组合成一个新值。
2.zipWith:把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元祖,才会触发压缩流的next事件。
3.merge:多个信号合并成一个信号,任何一个信号有新值就会调用
4.then — 使用需求:有两部分数据:想让上部分先进行网络请求但是过滤掉数据,然后进行下部分的,拿到下部分数据
5.concat----- 使用需求:有两部分数据:想让上部分先执行,完了之后再让下部分执行(都可获取值)4.RACBind
- RAC+MVVM 和 RAC+MVVM-网络请求
RAC在MVVM设计中,充当胶水的角色。
1、数据绑定:作用View和ViewModel之间,但ViewModel中数据因为用户的操作变化时,View更改马上更新。
2、网络请求: 把网络请求封装成Command,在View层触发网络访问
3、Model 数据变化的时候,更新ViewModel数据
- RAC常见的宏
1.RAC
作用:用来给某个对象的某个属性绑定信号,只要产生信号内容就会把内容给属性赋值
RAC(_label, text) = _textField.rac_textSignal;
2.RACObserver(self, name)
作用:只要这个对象的属性发生改变就会产生信号
[RACObserve(self.view, frame) subscribeNext:^(id x) {
NSLog(@“发生改变”);
}];
3. @weak(objc)和@strong(objc)
4.RACTuplePack: 把数据包装成RACTuple(元组类)
RACTuple *tuple = RACTuplePack(@“zhangsan”, @21);
5.RACTupleUnpack: 把RACTuple(元组类)解包成对应的数据
RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
NSLog(@"%@— %@", name, age);
//zhangsan—21
- 发送验证码示例
- 参考文档:
https://github.com/ReactiveCocoa/ReactiveObjC
https://www.jianshu.com/p/088dd8fce291