最近,RAC的名气可谓是越来越大,出于对技术的探索心(为了装逼),最近研究学习了一下RAC,以下是本人在学习中对其的一些粗浅的认识;
首先,什么是RAC,ReactiveCocoa时Github上的一个Cocoa FRP框架,目的为了接管苹果的所有事件机制(addTarget,代理,通知,KVO,时钟,网络处理);从其强大的作用就可以看出,这是一个超重量级大框架,慎用!
RAC运用的是函数响应式编程思想,那么什么是函数响应式编程思想,下面我们就从头说起:
说到编程思想,我们熟悉的就是面向过程编程思想和面向对象编程思想,面向过程 即根据问题,一步一实现,极其不利于代码的阅读和维护;面向对象 是对代码的抽象处理,即万物皆对象,由不同的对象,调用起自身的方法,实现相应的功能
下面来创建一个dog对象来具体分析下:
dog的.h文件
#import <Foundation/Foundation.h>
@interface Dog : NSObject
- (void)run;
- (void)eat;
dog的.m文件
#import "Dog.h"
@implementation Dog
- (void)run {
NSLog(@"%s", __FUNCTION__);
}
- (void)eat {
NSLog(@"%s", __FUNCTION__);
}
以下是在控制器中,创建dog类;
#import "ViewController.h"
#import "Dog.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Dog *dog = [Person new];
[dog run];
[dog eat];
以上就是面向对象编程的调用方法,只能单一点用,写起来比较繁琐;
接下来介绍链式编程思想,所谓链式编程,就是多个方法的调用可以像链条一样连接在一起,使代码的书写更简洁,可读性更好;
就像这样:
[[dog run1] eat1];
要想实现方法的这种调用方式,可以这样定义
- (Dog *)run1 {
NSLog(@"%s", __FUNCTION__);
return self;
}
- (Dog *)eat1 {
NSLog(@"%s", __FUNCTION__);
return self;
}
即每个方法都返回调用它的对象,以供调用后面的方法,这样,返回的对象就像一个链条,连接起了每个方法;
下面说一下函数式编程:
dog.run2().eat2();
dog.eat2().run2();
dog.run2().run2().eat2().run2();
要想实现这种调用方式,可以这样定义方法
//返回一个Block,Block返回self;
- (Dog * (^)())run2 {
Dog * (^runBlock)() = ^ {
NSLog(@"run2");
return self;
};
return runBlock;
}
- (Dog *(^)())eat2 {
return ^ {
NSLog(@"吃");
return self;
};
}
- (Dog *(^)(NSString *))eat3 {
return ^ (NSString *food) {
NSLog(@"吃%@", food);
return self;
};
}
- (Dog *(^)(double))run3 {
return ^ (double distance) {
NSLog(@"跑 %f米", distance);
return self;
};
}
dog.run3(500).eat3(@"骨头").run3(1000).eat3(@"便便");
写到这里相信大家已经发现,masonry框架就是采用这种编程思想;
下面再来说说响应式编程思想,响应式编程就是一种面向数据流和变化传播的编程范式。就是说可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
说人话就是,你在view中修改数据,model中会跟着变,在model中修改数据,view显示也跟着变,要实现这种效果,iOS开发中,要想实现这种效果,可以使用KVO,但是!苹果的KVO会统一调用同一个方法,且方法固定不变,当要监听的对象过多,十分难以管理维护;