ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架
Github-ReactiveCocoa地址
一直听说RAC,但一直未使用过,最近不算忙,研究和学习了一下,非常感谢
峥吖大神对RAC 的细解,受益匪浅。
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架。
截取Github上对ReactiveCocoa的说明:
RAC是提供事件流,通过信号源和信号源提供者(产生者),信号接受者协和来完成。
借用面向对象的一句话,万物皆是流的形式,通过一方发出信号,一方接受信号来完成不同事件。
ReactiveCocoa作用
高内聚,低耦合,使代码更加内聚,也便于代码的读取
不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
是把操作尽量写成一系列嵌套的函数或者方法调用。
特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参
数(需要操作的值)block返回值(操作结果)。
ReactiveCocoa结合了 函数式编程(Functional Programming)和 响应式编程(Reactive Programming)各自的优点,产生一种新的语法
如何导入ReactiveCocoa框架
1.CocoaPods
pod 'ReactiveCocoa'
有的需要在podfile中加入use_frameworks!,到时候终端会提醒的
我导入时需要加入target,如图所示
2.手动导入
由于工程之前一直是手动导入第三方框架,所以也希望手动添加ReactiveCocoa这个框架,但ReactiveCocoa在GitHub上并没有说明如何添加,需要哪些依赖等,所以自己直接把ReactiveCocoa整个文件夹拖到工程中,build以后,哪里报错修改哪里,最后不需要添加任何依赖,万幸,手动导入成功
RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。
只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。
默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
// 1.创建信号
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
// block调用时刻:每当有订阅者订阅信号,就会调用block。
// 2.发送信号
[subscriber sendNext:@"我是一个信号类"];
// 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。
[subscriber sendCompleted];
// block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
return [RACDisposable disposableWithBlock:^{
// 执行完Block后,当前信号就不在被订阅了。
NSLog(@"信号被销毁");
}];
}];
self.signal = signal;
// 3.订阅信号,才会激活信号
[signal subscribeNext:^(id x) {
NSLog(@"接收的数据:%@",x);
}];
表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。
用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
[RACDisposable disposableWithBlock:^{
// 执行完Block后,当前信号就不在被订阅了。
NSLog(@"信号被销毁");
}];
RACSubject:信号提供者,自己可以充当信号,又能发送信号。
RACSubject使用步骤:
// 1.创建信号
RACSubject *subject = [RACSubject subject];
// 2.订阅信号
[subject subscribeNext:^(id x) {
// block调用时刻:当信号发出新值,就会调用.
NSLog(@"第一个订阅者:%@",x);
}];
[subject subscribeNext:^(id x) {
// block调用时刻:当信号发出新值,就会调用.
NSLog(@"第二个订阅者:%@",x);
}];
// 3.发送信号
[subject sendNext:@"发送信号"];
// 监听事件
// 把按钮点击事件转换为信号,点击按钮,就会发送信号
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"按钮被点击");
}];
// 监听对象的属性值改变,转换成信号,只要值改变就会发送信号
[[View rac_valuesAndChangesForKeyPath:@"x" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
NSLog(@"view的x值发生了改变");
}];
// 代替通知
// 把监听到的通知转换信号
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
NSLog(@"键盘将要出现");
}];
// 通过RAC提供的宏快速实现观察者模式
// RACObserve(self, name):监听某个对象的某个属性,返回的是信号。
[RACObserve(self.greenView,x) subscribeNext:^(id x) {
NSLog(@"绿色view的x方向发生改变");
}];
// 监听文本框的文字改变
[[_textField rac_textSignal] subscribeNext:^(NSString *x) {
NSLog(@"文本框文字发生了改变:%@",x);
}];
// 通过RAC提供的宏快速实现textSingel的监听
// RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某个属性绑定。
// 当textField的文字发生改变时,label的文字也发生改变
RAC(self.textLabel,text) = self.textField.rac_textSignal;
// 监听手势
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];
[[tapGesture rac_gestureSignal] subscribeNext:^(id x) {
NSLog(@"view被触发tap手势");
}];
[self.view addGestureRecognizer:tapGesture];
// 过滤器
[[self.textField.rac_textSignal filter:^BOOL(NSString *value) {
return value.length >= 3;
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
这些只是对 ReactiveCocoa 的初步了解以及基本使用,还有更多功能和方法,需要我们去慢慢研究