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 ...
随机推荐
- PAT 1077 Kuchiguse
1077 Kuchiguse (20 分) The Japanese language is notorious for its sentence ending particles. Person ...
- 【PAT】我要通过!
“答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1 ...
- 数据结构算法之冒泡排序——Java语言实现
今天来谈下冒泡排序算法,这次实现由两种形式如下所示: 1.对于长度为N的数据序列,没有加标签限制,针对一开始就是有序的数据序列,仍然需要排序N-1趟来完成排序. 2.对于长度为N的数据序列,加标了签限 ...
- Docker(一) 安装Docker
1.在 Ubuntu上 安装 docker $ sudo apt-get install curl $ curl -fsSL get.docker.com -o get-docker.sh $ sud ...
- Spring Boot + Spring Cloud 实现权限管理系统 权限控制(Shiro 注解)
技术背景 当前,我们基于导航菜单的显示和操作按钮的禁用状态,实现了页面可见性和操作可用性的权限验证,或者叫访问控制.但这仅限于页面的显示和操作,我们的后台接口还是没有进行权限的验证,只要知道了后台的接 ...
- Go used as value问题
练习Go变参时遇到一个报错:used as value 代码如下: // 错误代码 func myfunc(arg ...int) { for _, n := range arg { fmt.Prin ...
- flask 自动切换环境
简介: 我就是个半吊子程序员.在单位写点程序,在家也写点程序. 单位是企业网,不能上互联网,家里也没办法连上企业网,没有VPN. 主武器是我的笔记本电脑.在单位有一台淘汰的linux服务器,家里有个N ...
- ui学习心得
软工课上我分配的任务是界面设计,但是对于初期一个ps从没接触的人来说我觉得还是有点困难,所以要从头学起. PS的功能是什么呢?对于业余爱好者来说,主要还是做一些简单的处理照片.绘图.设计一些皮肤等, ...
- VS遇到的问题记录
Q:id为xxxx的进程当前未运行 A:将端口改掉.
- 使用map()的小陷阱:parseInt
假设我们想要把一个字符串数组的每一项转换成整数,我们很自然就想到了把parseInt作为回调函数传给map()函数,但这样做可能会出现意想不到的结果: var strArr = ["1&qu ...