昨天内容回顾

信号类:表示有数据产生,信号类不发送数据

  • 注意:不同的信号,订阅方式不同

  • 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的更多相关文章

  1. ReactiveCocoa框架学习<一>

    1.Cocoapods导入ReactiveCocoa: use_frameworks! target 'RACDemo' do pod 'ReactiveObjC', '~> 2.1.0' en ...

  2. ReactiveCocoa框架学习1

    写block直接使用inline block的声明类型 在ARC中使用strong,如果不使用strong,则会被销毁 在非ARC中使用copy block在开发中的使用场景 把block保存到对象中 ...

  3. ReactiveCocoa 入门学习 (一)

    引言 现在由于需求的不断发展,MVC这个经典的框架由于Controller的任务越来越多,显得"臃肿"了,网上又推出了新的框架,比如MVVM,ReactiveCocoa, 今天就来 ...

  4. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  5. Hadoop学习笔记—18.Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  6. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  7. EF框架学习手记

    转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...

  8. web框架学习列表

    转载自鲁塔弗的博客,原文网址:http://lutaf.com/148.htm web framework层出不穷,特别是ruby/python,各有10+个,php/java也是一大堆 根据我自己的 ...

  9. 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理

    Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...

随机推荐

  1. php怎么保留相除后几位小数:sprintf

    $n=0.1265489; echo sprintf("%.2f", $n); // 0.13

  2. ubuntu下的supervisor启动express失败问题

    ubuntu下apt-get install nodejs后的启动命令是nodejs,而不同于windows下的node 所以我在supervisor启动express的时候出现了问题 提示如下: / ...

  3. 最新县及县以上行政区划代码JSON数据(截止2015年9月30日)含经纬度数据

    数据来源(国家统计局):http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/ 对数据进行的特殊处理: 将直辖市中的 “市辖区” 与 “县” 合并到区域 将 “省直辖县级行 ...

  4. CUDA获取显卡数据

    一个简单的获取Nvidia显卡信息的程序 #include<iostream> int main() { cudaDeviceProp prop; int count; cudaGetDe ...

  5. iOS - 打电话, 发短信

    电话.短信是手机的基础功能,iOS中提供了接口,让我们调用.这篇文章简单的介绍一下iOS的打电话.发短信在程序中怎么调用. 1.打电话 [[UIApplication sharedApplicatio ...

  6. Memcached(二)Memcached Java API基础之MemcachedClient

    1. 构造函数 public MemcachedClient(InetSocketAddress[] ia) throws IOException; public MemcachedClient(Li ...

  7. Mvc基础(1)

  8. django ORM中update_or_create功能,如果只要匹配某一特定字段呢

    今天发现的需求,在官方文档找到说法: In English, that means start with any non-'defaults' keyword argument that doesn’ ...

  9. 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)

    Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...

  10. 编译GNU/Linux共享库, 为什么要用PIC编译?

    http://blog.csdn.net/chenji001/article/details/5691690