RAC下的响应式编程
函数响应式编程可以极大地简化项目,特别是处理嵌套回调的异步事件,复杂的列表过滤和变换,或者时间相关问题.
介绍
命令式编程:以命令为主,给机器提供一条又一条的命令序列让其原封不动的执行. 函数响应式编程(FRP):使用异步数据流进行编程.FRP的思想比较难理解,需要将以往的命令式编程思想转变为响应式编程思想.即面向数据流编程.
就像面向对象思想一样,把事物都看作Stream.变量.用户输入.属性.Cache.数据结构等等.这个开始可能会很难.
在命令式编程环境中,a:=b+c表示将表达式的结果赋给a,而之后改变b或c的值不会影响a.但在响应式编程中,a的值会随着b或c的更新而更新.
电子表格程序就是响应式编程的一个例子.单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化.这很类似观察者模式(Gof).函数响应式编程的重点是流,Stream能接受一个,甚至多个Stream为输入.你可以merge两个Stream,也可以从一个Stream中filter出你感兴趣的Events以生成一个新的Stream,还可以把一个Stream中的Data values map到一个新的Stream中.
使用RAC
RAC就是一个第三方库,他可以大大简化你的代码过程。 官方的说,ReactiveCocoa(其简称为RAC)是由GitHub开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程和响应式编程的特性。
注意 : 使用时需要引用头文件
//基本示例
#import <ReactiveCocoa/ReactiveCocoa.h>
//监听了textFild的UIControlEventEditingChanged事件,当事件发生时实现block
[[self.textFild rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x){
NSLog(@"change");
}];
//文字更改监听
[[self.textFild rac_textSignal] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//手势监听
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[[tap rac_gestureSignal] subscribeNext:^(id x) {
NSLog(@"tap");
}];
[self.view addGestureRecognizer:tap];
//action监听
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[[btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) {
NSLog(@"***** 响应RAC button的点击 *****");
}];示例代码
一.用户登录
textfield的 内容发生改变是的响应方法
1.已通过map函数将信号转换成新的信号 2.将多个信号联合起来 3.将联合起来的信号来给按钮的属性赋值
二. 观察者模式KVO
RAC中得KVO大部分都是宏定义,所以代码异常简洁,简单来说就是RACObserve(TARGET, KEYPATH)这种形式,TARGET是监听目标,KEYPATH是要观察的属性值,这里举一个很简单的例子,如果UIScrollView滚动则输出success。
1.KVO来监听property的变化,只要被观察属性改变,block就会被执行. 2.该property必须支持KVO 3.使用必须在注册之后
三. taget - action
四. 延时
五. 通知
特别注意:RAC中的通知不需要remove observer,因为在rac_add方法中他已经写了remove。
六. 将多个不同类型的数据组合成一个元组
七. 使用 #define RAC(TARGET, ...)宏
Last updated