一、ReactiveCocoa简介

reactiveCocoa简称RAC,它是一个三方框架,很多人把它叫做函数响应式编程框架,因为它具有函数式编程和响应式编程的特性。
由于该框架的编程思想,使得它具有相当魅惑人心的功能,它能实现传统设计模式和事件监听所能实现的功能,比如KVO、通知、block回调、action、协议等等,它的全面性并不是它最为优越的特色,RAC最值得炫耀的是它提供了统一的消息传递机制,这种机制使得它的代码更加的简洁,同一功能代码块更少,这正是符合了我们编程的思想:高聚合、低耦合,它非常适合MVVM设计模式的开发。
不过它也并不是能完全取代传统的编码方式,在多人开发和代码维护方面,RAC还是有着一些让人头痛的问题。

二、ReactiveCocoa基本用法

(一)信号的创建、发送、接收

上面提到RAC有着统一的消息传递机制,所以不难理解它的动作都离不开一个词:signal。
  1. //创建
  2. RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
  3. //发送信号
  4. [subscriber sendNext:@"oh my god"];
  5. //回收资源
  6. return [RACDisposable disposableWithBlock:^{
  7. NSLog(@"信号发送完成");
  8. }];
  9. }];
  10. //订阅信号
  11. [signal subscribeNext:^(id x) {
  12. NSLog(@"singalContent:%@", x);
  13. }];
值得注意的是,手动创建一个signal一定要记得回收资源,不然程序会崩溃。
打印顺序是先打印“oh my god”再打印“信号发送完成”。

(二)RAC的ControlEvents

  1. [[self.textField rac_signalForControlEvents:UIControlEventEditingDidBegin] subscribeNext:^(id x) {
  2. NSLog(@"%@", x);
  3. }];

这个方法便简单的实现了监听操作,并且逻辑在其后的block中处理,同样的,还能对手势进行监听:

  1. UITapGestureRecognizer *tap = [UITapGestureRecognizer new];
  2. [[tap rac_gestureSignal] subscribeNext:^(id x) {
  3. NSLog(@"three:%@", x);
  4. }];
  5. [self.view addGestureRecognizer:tap];

(三)RAC的KVO

  1. [[self.textField rac_valuesAndChangesForKeyPath:@"text" options:NSKeyValueObservingOptionNew observer:self] subscribeNext:^(id x) {
  2. NSLog(@"%@", x);
  3. }];

(四)RAC的通知

  1. [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(id x) {
  2. NSLog(@"键盘弹起");
  3. }];

(五)RAC的协议

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. //代理
  4. self.textField.delegate = self;
  5. [[self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)] subscribeNext:^(id x) {
  6. NSLog(@"此处打印点击信息:%@", x);
  7. }];
  8. }
  9. - (void)textFieldDidBeginEditing:(UITextField *)textField {
  10. NSLog(@"此刻开始编辑了");
  11. }

从协议的写法可以看出,RAC的集合程度确实很高,如果需要写多个协议分类事件的触发,RAC有着极大的优越性。

(六)RAC遍历数组和字典

  1. NSArray *arr = @[@"1", @"2", @"3", @"4", @"5"];
  2. [arr.rac_sequence.signal subscribeNext:^(id x) {
  3. NSLog(@"arr : %@", x);
  4. }];
  5. NSDictionary *dic = @{@"name":@"yangBo", @"age":@"19"};
  6. [dic.rac_sequence.signal subscribeNext:^(id x) {
  7. NSLog(@"dic : %@", x);
  8. }];

相对于枚举遍历,我还没有测试过他们的效率谁高,有兴趣的朋友可以用instruments简单测试下

(七)RAC信号处理(map、filter、combine)

(1)对信号不做处理

  1. [[self.textField rac_textSignal] subscribeNext:^(id x) {
  2. NSLog(@"doNothing:%@", x);
  3. }];

(2)对信号进行过滤(filter)

  1. [[[self.textField rac_textSignal] filter:^BOOL(NSString* value) {
  2. if (value.length > 3) {
  3. return YES;
  4. }
  5. return NO;
  6. }] subscribeNext:^(id x) {
  7. NSLog(@"filer:%@", x);
  8. }];
  1. <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">注意这个地方第一个block返回的是BOOL值,如果为NO,信号订阅者将得不到信号了(也就是第二个block不再打印值了)。</span>

(3)对信号进行映射(map)

  1. [[[self.textField rac_textSignal] map:^id(NSString* value) {
  2. if (value.length > 3) {
  3. return @"map now";
  4. }
  5. return value;
  6. }] subscribeNext:^(id x) {
  7. NSLog(@"map:%@", x);
  8. }];

映射也可以理解为转换,可以看到这里的第一个block返回的是id类型,所以如果你没有返回value,就视为信号转换,第二个block打印的值就是你return的值。

(4)信号的联合(combine)

  1. //创建需要联合的信号
  2. RACSignal *firstCombineSignal = [self.textField rac_textSignal];
  3. RACSignal *secondeCombineSignal = [tap rac_gestureSignal];
  4. //信号联合处理返回self.label的背景色
  5. RAC(self.label, backgroundColor) = [RACSignal combineLatest:@[firstCombineSignal, secondeCombineSignal] reduce:^id(NSString *text, UITapGestureRecognizer * tap){
  6. //这里进行信号逻辑判断和处理
  7. if (text.length == 3 && tap.state == UIGestureRecognizerStateEnded) {
  8. return [UIColor redColor];
  9. }
  10. return [UIColor cyanColor];
  11. }];

(5)信号关联

  1. RAC(self.label, text) = [self.textField rac_textSignal];

信号关联或联合是非常灵活的两个处理方式,在实际开发中往往能用很简单的代码实现匪夷所思的功能。

 

三、总结

RAC是一个强大的工具,这篇博客只是作为一个小小的总结,这还只是RAC的冰山一角,RAC的灵活而强大,是每一个iOS开发者值得深入研究的一门课题。

iOS ReactiveCocoa的使用的更多相关文章

  1. IOS ReactiveCocoa

    一 前提: 在iOS开发过程中,当某些事件响应时,需处理的某些业务逻辑 Eg. 按钮点击:action ScrollView滚动:delegate 属性值改变:KVO ReactiveCocoa为事件 ...

  2. [iOS]ReactiveCocoa安装方法

    1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...

  3. iOS ReactiveCocoa(RAC)学习详解

    概述: ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,有时间,自己也了解学习了一下这个框架的一些基本的应用,其实你要学的话网上是有很多很多的博 ...

  4. iOS ReactiveCocoa简单使用笔记

    涉及对象: 两个输入框,一个按钮. 代码功能: 随时监测输入框内容的长度变化,并在输入内容不符合预设要求时,立即改变输入框背景色. 在两个输入框的内容都符合预设要求时,按钮才可用. RACSignal ...

  5. iOS ReactiveCocoa 最全常用API整理(可做为手册查询)

    本文适合有一定RAC基础的童鞋做不时的查询,所以本文不做详细解释. 一.常见类 1.RACSiganl 信号类. RACEmptySignal :空信号,用来实现 RACSignal 的 +empty ...

  6. iOS Reactivecocoa(RAC)知其所以然(源码分析,一篇足以)

    前言 如今RAC大行其道,对其讲解的博客也多不胜数,稍微有点经验的估计也已经对这个爽到不要不要的框架运用自如了,真正沉下来研究其实现原理的估计也不在少数,这里仅仅是记录一下自己的分析理解,更是在写这篇 ...

  7. iOS开发ReactiveCocoa学习笔记(六)

    RAC操作方法三. demo地址:https://github.com/SummerHH/ReactiveCocoa.git doNext deliverOn timeout interval del ...

  8. iOS-----GitHub上比较齐全的iOS 工具和App

    Github-iOS 工具 和 App   系统基础库 Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错-       BFKit 又一套Ca ...

  9. iPhone Tutorials

    http://www.raywenderlich.com/tutorials This site contains a ton of fun written tutorials – so many t ...

随机推荐

  1. jvm内存快照dump文件太大,怎么分析

    1.场景 通常,使用eclipse的mat图形化工具打开dump的时候都会内存溢出. 对于比较小的dump,eclipse可以打开,但一旦dump文件太大,eclipse就有点束手无策. 这时候怎么办 ...

  2. 八大排序算法——插入排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 例如从小到大排序: 1.  从第二位开始遍历, 2.  当前数(第一趟是第二位数)与前面的数依次比较,如果前面的数大于当前数,则将这个数放在当前数的位置上,当前数的下标-1 ...

  3. Win10系列:C#应用控件基础8

    ToggleSwitch控件 在应用程序中ToggleSwitch控件可以模拟一个允许用户在启用和禁用两种状态之间进行切换的物理开关,ToggleSwitch控件的功能与我们在日常生活中所使用的电源开 ...

  4. 序列化模块— json模块,pickle模块,shelve模块

    json模块 pickle模块 shelve模块 序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. # 序列化模块 # 数据类型转化成字符串的过程就是序列化 # 为了方便存储和网 ...

  5. babel,webpack-dev-server配置

    github仓库:https://github.com/llcMite/webpack.git 1.什么是webpack? webpack可以看做是模块打包机:它做的事情是,将静态资源当成模块打包成一 ...

  6. 微信开发】【Asp.net MVC】-- 微信分享功能

    [微信开发][Asp.net MVC]-- 微信分享功能 2017-01-15 09:09 by stoneniqiu, 12886 阅读, 15 评论, 收藏, 编辑 内嵌在微信中的网页,右上角都会 ...

  7. 【Java集合系列】目录

    2017-07-29 13:49:40 一.Collection的全局继承关系 二.系列文章 [Java集合系列一]ArrayList解析 备注: 1.ArrayList本质上就是一个数组,所有对外提 ...

  8. python基础——字典

    字典内置函数&方法 Python字典包含了以下内置函数: 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dict)计算字典元素个数,即键的总数. 3 ...

  9. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  10. JavaScript之循环

    我是昨天的小尾巴...https://blog.csdn.net/weixin_42217154/article/details/81182817 3.2 循环结构 循环结构是指在程序中需要反复执行某 ...