iOS ReactiveCocoa的使用
一、ReactiveCocoa简介
二、ReactiveCocoa基本用法
(一)信号的创建、发送、接收
- //创建
- RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
- //发送信号
- [subscriber sendNext:@"oh my god"];
- //回收资源
- return [RACDisposable disposableWithBlock:^{
- NSLog(@"信号发送完成");
- }];
- }];
- //订阅信号
- [signal subscribeNext:^(id x) {
- NSLog(@"singalContent:%@", x);
- }];
(二)RAC的ControlEvents
- [[self.textField rac_signalForControlEvents:UIControlEventEditingDidBegin] subscribeNext:^(id x) {
- NSLog(@"%@", x);
- }];
这个方法便简单的实现了监听操作,并且逻辑在其后的block中处理,同样的,还能对手势进行监听:
- UITapGestureRecognizer *tap = [UITapGestureRecognizer new];
- [[tap rac_gestureSignal] subscribeNext:^(id x) {
- NSLog(@"three:%@", x);
- }];
- [self.view addGestureRecognizer:tap];
(三)RAC的KVO
- [[self.textField rac_valuesAndChangesForKeyPath:@"text" options:NSKeyValueObservingOptionNew observer:self] subscribeNext:^(id x) {
- NSLog(@"%@", x);
- }];
(四)RAC的通知
- [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(id x) {
- NSLog(@"键盘弹起");
- }];
(五)RAC的协议
- - (void)viewDidLoad {
- [super viewDidLoad];
- //代理
- self.textField.delegate = self;
- [[self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)] subscribeNext:^(id x) {
- NSLog(@"此处打印点击信息:%@", x);
- }];
- }
- - (void)textFieldDidBeginEditing:(UITextField *)textField {
- NSLog(@"此刻开始编辑了");
- }
从协议的写法可以看出,RAC的集合程度确实很高,如果需要写多个协议分类事件的触发,RAC有着极大的优越性。
(六)RAC遍历数组和字典
- NSArray *arr = @[@"1", @"2", @"3", @"4", @"5"];
- [arr.rac_sequence.signal subscribeNext:^(id x) {
- NSLog(@"arr : %@", x);
- }];
- NSDictionary *dic = @{@"name":@"yangBo", @"age":@"19"};
- [dic.rac_sequence.signal subscribeNext:^(id x) {
- NSLog(@"dic : %@", x);
- }];
相对于枚举遍历,我还没有测试过他们的效率谁高,有兴趣的朋友可以用instruments简单测试下
(七)RAC信号处理(map、filter、combine)
(1)对信号不做处理
- [[self.textField rac_textSignal] subscribeNext:^(id x) {
- NSLog(@"doNothing:%@", x);
- }];
(2)对信号进行过滤(filter)
- [[[self.textField rac_textSignal] filter:^BOOL(NSString* value) {
- if (value.length > 3) {
- return YES;
- }
- return NO;
- }] subscribeNext:^(id x) {
- NSLog(@"filer:%@", x);
- }];
- <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">注意这个地方第一个block返回的是BOOL值,如果为NO,信号订阅者将得不到信号了(也就是第二个block不再打印值了)。</span>
(3)对信号进行映射(map)
- [[[self.textField rac_textSignal] map:^id(NSString* value) {
- if (value.length > 3) {
- return @"map now";
- }
- return value;
- }] subscribeNext:^(id x) {
- NSLog(@"map:%@", x);
- }];
映射也可以理解为转换,可以看到这里的第一个block返回的是id类型,所以如果你没有返回value,就视为信号转换,第二个block打印的值就是你return的值。
(4)信号的联合(combine)
- //创建需要联合的信号
- RACSignal *firstCombineSignal = [self.textField rac_textSignal];
- RACSignal *secondeCombineSignal = [tap rac_gestureSignal];
- //信号联合处理返回self.label的背景色
- RAC(self.label, backgroundColor) = [RACSignal combineLatest:@[firstCombineSignal, secondeCombineSignal] reduce:^id(NSString *text, UITapGestureRecognizer * tap){
- //这里进行信号逻辑判断和处理
- if (text.length == 3 && tap.state == UIGestureRecognizerStateEnded) {
- return [UIColor redColor];
- }
- return [UIColor cyanColor];
- }];
(5)信号关联
- RAC(self.label, text) = [self.textField rac_textSignal];
信号关联或联合是非常灵活的两个处理方式,在实际开发中往往能用很简单的代码实现匪夷所思的功能。
三、总结
iOS ReactiveCocoa的使用的更多相关文章
- IOS ReactiveCocoa
一 前提: 在iOS开发过程中,当某些事件响应时,需处理的某些业务逻辑 Eg. 按钮点击:action ScrollView滚动:delegate 属性值改变:KVO ReactiveCocoa为事件 ...
- [iOS]ReactiveCocoa安装方法
1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...
- iOS ReactiveCocoa(RAC)学习详解
概述: ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,有时间,自己也了解学习了一下这个框架的一些基本的应用,其实你要学的话网上是有很多很多的博 ...
- iOS ReactiveCocoa简单使用笔记
涉及对象: 两个输入框,一个按钮. 代码功能: 随时监测输入框内容的长度变化,并在输入内容不符合预设要求时,立即改变输入框背景色. 在两个输入框的内容都符合预设要求时,按钮才可用. RACSignal ...
- iOS ReactiveCocoa 最全常用API整理(可做为手册查询)
本文适合有一定RAC基础的童鞋做不时的查询,所以本文不做详细解释. 一.常见类 1.RACSiganl 信号类. RACEmptySignal :空信号,用来实现 RACSignal 的 +empty ...
- iOS Reactivecocoa(RAC)知其所以然(源码分析,一篇足以)
前言 如今RAC大行其道,对其讲解的博客也多不胜数,稍微有点经验的估计也已经对这个爽到不要不要的框架运用自如了,真正沉下来研究其实现原理的估计也不在少数,这里仅仅是记录一下自己的分析理解,更是在写这篇 ...
- iOS开发ReactiveCocoa学习笔记(六)
RAC操作方法三. demo地址:https://github.com/SummerHH/ReactiveCocoa.git doNext deliverOn timeout interval del ...
- iOS-----GitHub上比较齐全的iOS 工具和App
Github-iOS 工具 和 App 系统基础库 Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错- BFKit 又一套Ca ...
- iPhone Tutorials
http://www.raywenderlich.com/tutorials This site contains a ton of fun written tutorials – so many t ...
随机推荐
- 搜狗浏览器或者360浏览器安装chrome 浏览器插件
https://www.cnblogs.com/ingvar/p/6403777.html#undefined
- python笔记15-集合
集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不能根据下标来取值,不重复的,也就是说集合中是没有重复的数据 #定义集合:# #方法1:nums = [1,1,1,1,23,4,56]#定义 ...
- HTML5:图片、音乐和视频
图片.音乐和视频 一.图片 1.属性 属性 说明 alt 规定图像的替代文本. src 规定显示图像的 URL align 规定如何根据周围的文本来排列图像. border 定义图像周围的边框. he ...
- 理解微信小程序的生命周期和运行原理
写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君公众号带你学习小程序的生命周期和运行原理. 小程序由两大线程组成:负责界面的线程(view thread)和服务线 ...
- 自动化测试-3.selenium8种常用元素定位
自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.本篇主要讲如何用firefox辅助工具进行元素定位. 元素定位在这四个环节中是至关重要 ...
- 实验楼高级bash脚本编程指南 挑战:简单的热身
传送门:https://www.shiyanlou.com/courses/running# 步骤一 新建一个 test.sh 输出 Hello Shiyanlou! 步骤二 复制 test.sh 为 ...
- ecmall 后台添加新菜单
所谓的开发新菜单,其实是和开发模块相对比的,之前说的开发模块,是在应对较大的,或者较为复杂,又相对独立于其他功能的项目需求. 而开发菜单,就是简单的在后台增加一个一级菜单以及其子菜单,或者直接在现有的 ...
- awrrpt.sqll生成awr报ORA-06502,ORA-06512
客户环境SumOS操作系统,数据库版本11.2.0.3,rac两节点: 在节点2,执行awr报告,输出报错,有时候可以成功,有时候失败. 报错现象 SQL>@?/rdbms/admin/awrr ...
- 关于multi-index
[转载请注明出处]http://www.cnblogs.com/mashiqi 2017/02/22 将$D^{\alpha}$和$\partial^{\alpha}$区别对待.$D^{\alpha} ...
- 爬虫案例(js动态生成数据)
需求:爬取https://www.xuexi.cn/f997e76a890b0e5a053c57b19f468436/018d244441062d8916dd472a4c6a0a0b.html页面中的 ...