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 ...
随机推荐
- hello2源代码解析
String username = request.getParameter("username");/**以 String 形式返回请求参数"username" ...
- SQL列转行用逗号隔开
declare @result varchar(255) set @result = ” select @result = @result + cast(F_IT_FWID as varchar( ...
- Php基本类型——布尔类型
1)简介 布尔类型,这是最简单的类型,bollean表达了真值,可以为true或false,它是php4引进的. 2)语法 要指定一个布尔值,使用关键字true或false,两个都不区分大小写. &l ...
- CUDA编程常见问题 转
http://blog.csdn.net/yutianzuijin/article/details/8147912 分类: 编程语言2012-11-05 10:55 2521人阅读 评论(0) 收藏 ...
- <转载> 从算法上解读自动驾驶是如何实现的?
科技新闻小鹏汽车2016-03-28 10:42 [摘要]车辆路径规划问题中路网模型.路径规划算法和交通信息的智能预测为关键点. 由于驾驶员的驾驶工作繁重,同时随着汽车拥有量的增加,非职业驾驶员的数 ...
- Linux中实现文本过滤
alias命令 功能:设置指令的别名 语法:alias [别名]=[指令名称] 参数:若不加任何参数,则列出所有别名的设置 说明:alias仅作用于当前登录的shell.若要永久使用别名,可在/etc ...
- Linux下安装Julia1.0.0
MIT正式发布编程语言Julia 1.0:Python.R.C++三合一! 由于官方文档提示中安装的不是最新的Julia版本,官方的0.7版本安装方法为: ...
- Eclipse错误集合
一.Could not write metadata for '/RemoteSystemsTempFiles'. 错误代码 Could not write metadata for '/Remote ...
- `ifdef、`else、`endif 用法
一般情况下,Verilog HDL源程序中所有的行都参加编译.但是有时候希望对其中的一部份内容只有在条件满足的时候才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足条件 ...
- Mac 下配置Lua环境
1.下载LUA源码包 curl -R -O http://www.lua.org/ftp/lua-5.3.1.tar.gz 2.解压并进入目录 tar -xvf lua-.tar.gz cd lua- ...