ReactiveCocoa框架学习2
昨天内容回顾
信号类:表示有数据产生,信号类不发送数据
- 注意:不同的信号,订阅方式不同
 
- RACSignal
- 创建RACDynamicSignal信号 -> didSubscribe(block)
 - 创建订阅者RACSubscriber
 - 执行didSubscribe的block
 
 - RACSubject -> subscribers(array)
- 创建订阅者RACSubscriber
 - 保存订阅者到subscribers数组
 
 - RACReplaySubject -> valuesReceived(array)
- 创建订阅者RACSubscriber
 - 拿到当前创建的订阅者,发送之前保存在valuesReceived中的所有值
 
 
订阅者:发送数据
- 注意:不同订阅者,发送数据的方式不同
 
- RACSubscriber -> nextBlock(block)
- 直接执行nextBlock
 
 - RACSubject -> subscribers(array)
- 遍历自己所有的订阅者,发送数据
 
 - RACReplaySubject -> valuesReceived(array)
- 保存发送的值
 - 遍历自己所有的订阅者,发送数据
 
 
- RACSubject和RACReplaySubject的区别
- 前者必须先订阅信号,再发送信号
 - 后者由于在发送信号的时候会保存发送的值,在订阅信号的时候会先发送之前保存的值,所以可以先发送信号,再订阅信号.
 - 两者的共同之处在于,可以先订阅信号,再发送信号.
 
 
今日内容总结
RAC在开发中的常见用法
- 处理多个请求,都返回结果的时候,统一做处理
- 创建信号1,发送请求1
 - 创建信号2,发送请求2
 - 使用rac_liftSelector:withSignalsFromArray:在两个请求发送完毕后,调用selector中的方法
 - 注意:信号数组中有几个信号,selector方法中就有几个参数,每个参数对应信号发出的数据
 
 
RAC中常见的宏
- RAC()
- 用于给某个对象的某个属性绑定
 - RAC(_lable, text) = _textField.rac_textSignal
 - 只要文本框文字改变,就会修改label的文字
 
 - RACObserver(self, name)
- 监听某个对象的某个属性,返回的是信号
 - 直接订阅信号,在subscribeNext的block中对属性的值进行处理
 
 - @weakify(obj)和@strongify(obj)
- 一般两个都是配套使用,解决循环引用问题
 
 - RACTuplePack:把数据包装成RACTuple(元组类)
 - RACTupleUnpack:把RACTuple(元组类)解包成对应的数据
 
RACMulticastConnection
- 每次订阅不要都请求一次,只要请求一次,每次订阅只拿到数据
 - 不管订阅多少次信号,就会请求一次
 - 使用RACMulticastConnection必须要有信号
- 创建信号
 - 把信号转换成连接类
 - 订阅连接类的信号
 - 连接
 
 - 底层实现
- 创建信号RACSignal,其中的didSubscribe在连接类连接的时候才执行
 - 把信号转换成连接类,确定源信号的订阅者为RACSubject
 - 使用publish转换连接类为RACSubject
 - 使用multicast转换连接类为RACReplaySubject
 - 订阅连接类信号,其中的nextBlock会在发送数据的时候执行
 - 由于连接类信号为RACSubject,在订阅该类型信号的时候会自动保存订阅者
 - 连接[connection connect]
 
 
RACCommand
- 作用:用来处理事件,不能返回一个空的信号
 - 使用步骤:
- 创建命令:[[RACCommand alloc] initWithSignalBlock:]
 - 其中block中的参数input:执行命令传入的参数
 - block调用的时机:执行命令的时候就会调用
 - return一个不为nil的RACSignal,在RACSignal的block中发送数据
 - 执行命令:[command execute:@1]
 
 - 如何拿到执行命令中产生的数据
- 方式一:直接订阅执行命令返回的信号
 - 方式二:订阅command.executionSignals,必须要在执行命令之前订阅
 
 - executionSignals:信号源,信号中的信号
 - signalOfSignals:信号,发送的数据就是信号
 - 高级用法:command.executionSignals.switchToLatest,用来获取最新发送的信号,只能用于信号中的信号
 - 底层实现:
- 创建RACSubject(signalOfSignals)
 - 创建RACSubject(signal)
 
 - 监听事件是否完成
- 使用command.executing
 - 注意:当前命令内部发送数据完成,一定要主动发送完成
 - [subscriber sendCompleted]
 
 
RAC的核心方法bind
- RAC操作的核心方法是bind(绑定),给RAC中的信号进行绑定,只要信号一发送数据,就能监听到,从而把发送数据改成自己想要的数据.
 - 使用步骤:
- 创建RACSubject类型的源信号
 - 绑定RACSubject信号,创建RACSignal信号,其中的block在绑定信号被订阅的时候就会调用
 - 返回RACSignal,其中的block在源信号发送数据的时候被调用,用来处理源信号的内容,block中的value代表源信号发送的内容,block中的返回信号不能传nil,使用RACReturnSignal对源信号的内容进行包装[RACReturnSignal return:value]
 - 订阅绑定信号,其中的block在处理完信号发送数据的时候会被调用
 - 发送数据
 
 
RAC中的映射
- 映射的作用:用于把源信号内容映射成新的内容
 - flattenMap
- 创建信号
 - 绑定信号
- block:只要源信号发送内容就调用
 - value:就是源信号发送的内容
 - return:返回信号用来包装成修改内容值
 
 - 订阅信号
- flattenMap中返回的是什么信号,订阅的就是什么信号
 - 通常用于信号中的信号
 
 - 发送数据
 
 - map
- 创建信号
 - 绑定信号
- 返回的类型,就是需要映射的值
 
 - 订阅绑定信号
 - 发送数据
 
 - 两者的区别:
- flattenMap通常用于信号中的信号
 - flattenMap中的block返回信号
 - map中的block返回对象
 - 开发中,如果信号发出的值不是信号,映射一般使用map
 - 开发中,如果信号发出的值是信号,映射一般使用flattenMap
 
 
RAC操作方法之组合
- concat
- 作用:按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号
 - 把signalA拼接到signalB后,signalA发送完成,signalB才会被激活
 - 以后只需要面对拼接信号开发
 - 订阅拼接的信号,不需要单独订阅signalA,signalB
 - 内部会自动订阅
 - 注意:第一个信号必须发送完成,调用sendCompleted,第二个信号才会被激活
 
 - then
- 作用:用于连接两个信号,当第一个信号完成,才会连接then返回的信号
 - 注意:使用then,之前信号的值会被忽略掉
 - 底层实现:先过滤掉之前的信号发出的值,使用concat连接then返回的信号
 
 - merge
- 作用:把多个信号合并为一个信号,任何一个信号有新值的时候就会调用
 
 - zipWith
- 把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元组,才会触发压缩流的next事件
 
 - combineLatest
- 将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的signal至少都有过一次sendNext,才会触发合并的信号
 
 - reduce(聚合)
- 用于信号发出的内容是元组,把信号发出元组的值聚合成一个值
 
 
RAC操作方法之过滤
- filter:过滤信号,使用它可以获取满足条件的信号
 - ignore:忽略某些值得信号
 - distinctUntilChanged:当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉
 - take:从开始一共取N次的信号
 - takeLast:去最后N次的信号,前提条件,订阅者必须调用完成,因为只有完成才知道总共有多少信号
 - takeUntil:获取信号直到执行完这个信号或者这个信号发送任意数据
 - skip:跳过几个信号,不接受
 
ReactiveCocoa框架学习2的更多相关文章
- ReactiveCocoa框架学习<一>
		
1.Cocoapods导入ReactiveCocoa: use_frameworks! target 'RACDemo' do pod 'ReactiveObjC', '~> 2.1.0' en ...
 - ReactiveCocoa框架学习1
		
写block直接使用inline block的声明类型 在ARC中使用strong,如果不使用strong,则会被销毁 在非ARC中使用copy block在开发中的使用场景 把block保存到对象中 ...
 - ReactiveCocoa 入门学习 (一)
		
引言 现在由于需求的不断发展,MVC这个经典的框架由于Controller的任务越来越多,显得"臃肿"了,网上又推出了新的框架,比如MVVM,ReactiveCocoa, 今天就来 ...
 - IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
		
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
 - Hadoop学习笔记—18.Sqoop框架学习
		
一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...
 - Spring框架学习一
		
Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...
 - EF框架学习手记
		
转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...
 - web框架学习列表
		
转载自鲁塔弗的博客,原文网址:http://lutaf.com/148.htm web framework层出不穷,特别是ruby/python,各有10+个,php/java也是一大堆 根据我自己的 ...
 - 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理
		
Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...
 
随机推荐
- js传带参数的函数
			
字符串: setTimeout('pageScroll(4)',100);
 - 禁止选择文本和禁用右键 v1.0
			
var zhonghao={ //绑定事件 myAddEvent: function(obj, sEvent, fn){if(obj.attachEvent){obj.attachEvent('on' ...
 - ubuntu apt-get
			
近期重新拿起linux的书看了下,整理了一下linux的命令. ubuntu预装了APT和dpkg ,“APT”是 “Advanced Package Tool”的简写,“dpkg ”是“Debian ...
 - 解析sql中的表名
			
最近的项目需求中需要解析sql得表名,由于只需要表名我觉得应该用相对粗暴一点的方式来解析 初步思路: 1.转义字符:去除两个引号连在一起的 2.字符串: 去除所有被引号包裹的 3.括号:识别括号处理 ...
 - glibc 安装( version `GLIBC_2.14' not found")
			
在ubuntu上编译的东西 拿到CentOS 下运行 提示 :“/lib64/libc.so.6: version `GLIBC_2.14' not found” 原因是ubuntu上用的libc 版 ...
 - JS单元测试框架:QUnit
			
QUnit:jQuery的单元测试框架,但不仅限于jQuery(从这个工具不需要引用jquery.js可以看出) index.html <!-- 官网 http://qunitjs.com/ - ...
 - 欧几里得旅行商问题  java与c++实现
			
双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这个解的一般形式为NP的(在多项式时间内可 ...
 - WordPress 使用 Pie-Register 添加前台注册、登录、找回密码和编辑个人资料功能
			
转自:http://www.wpdaxue.com/front-end-publishing.html Pie-Register 是一个功能比较完善的 WordPress 才能,使用它可以很方便添加和 ...
 - keybd_event函数用法
			
转自不用winio,直接达到驱动级模拟键盘效果的keybd_event函数用法 键盘模拟技术是在编写游戏外挂时经常使用的技术.但是由于很多游戏采用了directinput的方式,使得发送的一般键盘消息 ...
 - phpStorm 快捷键收集以及配色方案
			
仅收集我在开发过程中觉得对我个人很有帮助的 ctrl + e ;查看最近打开的工程文件 ctrl+shift+n比如要跳转到templates/default/index.html基本上输入te/de ...