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 ...
随机推荐
- WEB UI做TREE
效果图: 原本的普通搜索帮助,改成上面这样层级的搜索帮助.这里只做了两级. 一,新建一个TREE节点 1.新建tree结构:ZGRTEXT 2.新建树叶节点处理类: 修改超类为CL_BSP_WD_TR ...
- 数据结构与算法之PHP排序算法(归并排序)
一.基本思想 归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,使每个子序列有序,再将已有序的子序列合并,得到完全有序的序列.该算法是采用分治法(Divid ...
- struts2必备jar包(2.1.6版本)
struts2必备jar包(2.1.6版本) struts2(2.1.6版本)必备的jar包有6个 struts2-core-2.1.6.jar freemarker-2.3.13.jar commo ...
- 洛谷 P2661信息传递
图论——>并查集 P2661 本蒟蒻啥也不会 这题还WA了1次 = = 最后看题解A 哭了 看题是多个(N<=200000)东西之间的关系维护 果断想到并查集 在第i个位置的a[i] 表 ...
- 解决pycharm添加第三方包失败
今天想用pycharm打开图像,但是import scipy的时候报错了,报错内容如下: from scipy.misc import imread Traceback (most recent ca ...
- kafka consumer 指定 offset,进行消息回溯
kafka consumer 如何根据 offset,进行消息回溯?下面的文档给出了 demo: https://cwiki.apache.org/confluence/display/KAFKA/0 ...
- Python3+SQLAlchemy+Sqlite3实现ORM教程
一.安装 Sqlite3是Python3标准库不需要另外安装,只需要安装SQLAlchemy即可.本文sqlalchemy版本为1.2.12 pip install sqlalchemy 二.ORM操 ...
- SocketServer模块,hmac模块验证client合法性
hmac模块: 1.模块初识: import hmac # h = hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 ...
- FCC JS基础算法题(12):Where do I belong(数组排序并找出元素索引)
题目描述: 先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引.举例:where([1,2,3,4], 1.5) 应该返回 1.因为1.5插入到数组[1,2,3,4]后变成[1,1.5 ...
- oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接
oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接 oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接 or ...