iOS-ReactiveCocoa(RAC)的初步了解以及基本使用
来源:互联网 发布:北京java薪资待遇 编辑:程序博客网 时间:2024/04/29 23:36
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架
Github-ReactiveCocoa地址
一直听说RAC,但一直未使用过,最近不算忙,研究和学习了一下,非常感谢
峥吖大神对RAC 的细解,受益匪浅。
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架。
截取Github上对ReactiveCocoa的说明:
RAC是提供事件流,通过信号源和信号源提供者(产生者),信号接受者协和来完成。
借用面向对象的一句话,万物皆是流的形式,通过一方发出信号,一方接受信号来完成不同事件。
ReactiveCocoa作用
- 代理方法
- block 回调
- 通知
- 行为控制和事件的响应链
- 协议
- KVO
- ……
主要作用:
高内聚,低耦合,使代码更加内聚,也便于代码的读取
响应式编程思想:
不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
函数式编程思想:
是把操作尽量写成一系列嵌套的函数或者方法调用。
特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参
数(需要操作的值)block返回值(操作结果)。
ReactiveCocoa编程风格:
ReactiveCocoa结合了 函数式编程(Functional Programming)和 响应式编程(Reactive Programming)各自的优点,产生一种新的语法
如何导入ReactiveCocoa框架
1.CocoaPods
pod 'ReactiveCocoa'
有的需要在podfile中加入use_frameworks!,到时候终端会提醒的
我导入时需要加入target,如图所示
2.手动导入
由于工程之前一直是手动导入第三方框架,所以也希望手动添加ReactiveCocoa这个框架,但ReactiveCocoa在GitHub上并没有说明如何添加,需要哪些依赖等,所以自己直接把ReactiveCocoa整个文件夹拖到工程中,build以后,哪里报错修改哪里,最后不需要添加任何依赖,万幸,手动导入成功
ReactiveCocoa常见类。
01.RACSiganl ,在RAC中最核心的类
RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。
只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。
默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
// 1.创建信号 RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> 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); }];
02.RACSubscriber:
表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。
03.RACDisposable:
用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
[RACDisposable disposableWithBlock:^{ // 执行完Block后,当前信号就不在被订阅了。 NSLog(@"信号被销毁");}];
04.RACSubject:
RACSubject:信号提供者,自己可以充当信号,又能发送信号。
RACSubject使用步骤:
- 1.创建信号 [RACSubject subject],跟RACSiganl不一样,创建信号时没有block。
- 2.订阅信号 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 3.发送信号 sendNext:(id)value
// 1.创建信号 RACSubject *subject = [RACSubject subject]; // 2.订阅信号 [subject subscribeNext:^(id x) { // block调用时刻:当信号发出新值,就会调用. NSLog(@"第一个订阅者:%@",x); }]; [subject subscribeNext:^(id x) { // block调用时刻:当信号发出新值,就会调用. NSLog(@"第二个订阅者:%@",x); }]; // 3.发送信号 [subject sendNext:@"发送信号"];
ReactiveCocoa在开发中常见的用法
Event(按钮的点击)
// 监听事件 // 把按钮点击事件转换为信号,点击按钮,就会发送信号 [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { NSLog(@"按钮被点击"); }];
KVO观察者
// 监听对象的属性值改变,转换成信号,只要值改变就会发送信号 [[View rac_valuesAndChangesForKeyPath:@"x" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) { NSLog(@"view的x值发生了改变"); }];
Notification通知
// 代替通知 // 把监听到的通知转换信号 [[[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的文字信号
// 监听文本框的文字改变 [[_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];
过滤器filter方法的使用
// 过滤器 [[self.textField.rac_textSignal filter:^BOOL(NSString *value) { return value.length >= 3; }] subscribeNext:^(id x) { NSLog(@"%@",x); }];
这些只是对 ReactiveCocoa 的初步了解以及基本使用,还有更多功能和方法,需要我们去慢慢研究
- iOS-ReactiveCocoa(RAC)的初步了解以及基本使用
- iOS深入了解ReactiveCocoa的使用(二)
- iOS- ReactiveCocoa-RAC-1
- iOS函数响应式编程以及ReactiveCocoa的使用
- iOS-ReactiveCocoa(RAC)的高级使用之视图与模型的双向绑定
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例
- iOS RAC~ReactiveCocoa 方法作用
- iOS开发ReactiveCocoa的使用
- Unix/linux进程及线程间同步技术总结
- wpf devexpress gridcontrol捕获集合改变事件
- hdu5842-Lweb and String-续缘之路
- INFORMATICA学习之路-01-安装问题1-PING不通DOMAIN
- laravel框架写库关联导航栏
- iOS-ReactiveCocoa(RAC)的初步了解以及基本使用
- 管理进程和计划任务
- appserv中使用mysql时向数据库中添加数据时报错
- web端打印,可以忽略部分内容不打印
- Sublime Text 快捷键
- leetcode-House Robber III-337(树形dp)
- svn操作命令
- 动态建树之——一个单词是否在其他单词中以前缀的形式存在
- CDOJ 149 解救小Q 搜索 BFS