**推荐:ReactiveCocoa和MVVM专题,汇聚一些优秀相关博客 **
ReactiveCocoa为事件定义了一个标准接口,从而可以使用一些基本工具来更容易的连接、过滤和组合。如果你对上面说的还比较疑惑,那还是继续往下看吧。
一 )函数响应式编程名称的由来
ReactiveCocoa结合了几种编程风格:
- 函数式编程(Functional Programming):使用高阶函数,例如函数用其他函数作为参数.
- 响应式编程(Reactive Programming):关注于数据流和变化传播。
所以,你可能听说过ReactiveCocoa被描述为函数响应式编程(FRP)框架。
二 )ReactiveCocoa作用
在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。比如按钮的点击使用action,ScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式。其实这些事件,都可以通过RAC处理ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高聚合,低耦合的思想。
三) 信号的逻辑图
核心概念是RACSignal,相当于一个信号管道,接收信号源的信号,将信号依次发送给
四 ) RAC 和MVVM 结合使用图
五 RAC 简单实用二十例
ReactiveCocoa简单使用20例 超级值得一看和尝试
六 ) ReactiveCocoa常见类。
学习框架首要之处:个人认为先要搞清楚框架中常用的类,在RAC中最核心的类RACSiganl,搞定这个类就能ReactiveCocoa开发了。
6.1RACSiganl
信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。注意信号类(RACSiganl),只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。
默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
如何订阅信号:调用信号RACSignal的subscribeNext
就能订阅。
6.2RACSubscriber
:表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。
6.3RACDisposable
用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
使用场景
:不想监听某个信号时,可以通过它主动取消订阅信号。
6.4RACSubject
:RACSubject:信号提供者,自己可以充当信号,又能发送信号。
6.6RACTuple
元组类,类似NSArray,用来包装值.
6.7RACSequence
:RAC中的集合类,用于代替NSArray,NSDictionary,可以使用它来快速遍历数组和字典。
6.8RACCommand
RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。
使用场景
监听按钮点击,网络请求
6.9RACMulticastConnection
用于当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block,造成副作用,可以使用这个类处理。
6.10 RACScheduler
RAC中的队列,用GCD封装的。
6.11 RACUnit
表⽰stream不包含有意义的值,也就是看到这个,可以直接理解为nil.
6.12RACEvent
把数据包装成信号事件(signal event)。它主要通过RACSignal的-materialize来使用,然并卵。
七).ReactiveCocoa开发中常见用法。
7.1 代替代理:
rac_signalForSelector 用于替代代理。
7.2 代替KVO :
rac_valuesAndChangesForKeyPath 用于监听某个对象的属性改变。
7.3 监听事件:
rac_signalForControlEvents 用于监听某个事件。
7.4 代替通知:
rac_addObserverForName 用于监听某个通知。
7.5 监听文本框文字改变:
rac_textSignal 只要文本框发出改变就会发出这个信号。
7.6 处理当界面有多次请求时,需要都获取到数据时,才能展示界面
八).ReactiveCocoa常见宏。
8.1RAC
(TARGET, [KEYPATH, [NIL_VALUE]])用于给某个对象的某个属性绑定。// 只要文本框文字改变,就会修改label的文字 RAC(self.labelView,text) = _textField.rac_textSignal;
8.2RACObserve(self, name)
:监听某个对象的某个属性,返回的是信号。
[RACObserve(self.view, center) subscribeNext:^(id x) { NSLog(@"%@",x); }];
8.3@weakify(Obj)和@strongify(Obj)
,一般两个都是配套使用,在主头文件(ReactiveCocoa.h
)中并没有导入,需要自己手动导入,RACEXTScope.h
才可以使用。但是每次导入都非常麻烦,只需要在主头文件自己导入就好了。
8.4RACTuplePack
:把数据包装成RACTuple(元组类)
// 把参数中的数据包装成元组 RACTuple *tuple = RACTuplePack(@10,@20);
8.5RACTupleUnpack
:把RACTuple(元组类)解包成对应的数据。
// 把参数中的数据包装成元组 RACTuple *tuple = RACTuplePack(@"xmg",@20); // 解包元组,会把元组的值,按顺序给参数里面的变量赋值 // name = @"xmg" age = @20 RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
参考资料
ReactiveCocoa之基础篇
ReactiveCocoa之进阶篇
函数响应式编程
- 作者开发经验总结的文章推荐,持续更新学习心得笔记
Runtime 10种用法(没有比这更全的了)
成为iOS顶尖高手,你必须来这里(这里有最好的开源项目和文章)
iOS逆向Reveal查看任意app 的界面
JSPatch (实时修复App Store bug)学习(一)
iOS 高级工程师是怎么进阶的(补充版20+点)
扩大按钮(UIButton)点击范围(随意方向扩展哦)
最简单的免证书真机调试(原创)
通过分析微信app,学学如何使用@2x,@3x图片
TableView之MVVM与MVC之对比
使用MVVM减少控制器代码实战(减少56%)
ReactiveCocoa添加cocoapods 配置图文教程及坑总结