昨天内容回顾

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

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

  • 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. VS2015安装开发ios android

    前几天很火,装了一下,结果是不是太满意,装了VS2015只是多了一个android和ios的模版,最终还是要装xamarin ,最后装了个xamarin ,然后破解 破解地址:http://www.c ...

  2. Ubuntu15.10 编译VLC Android(安卓)过程记录

    持续更新中... 最后一次修改于 2016-03-20 15:33:45 1.必要库的安装 除基本编译环境(gcc.g++等外),需要额外安装如下的库(用于下载必要的依赖文件) (1)JDK 推荐安装 ...

  3. PhoneGap 3 在 Mac 上安装使用

    1.下载安装 NodeJS . 2.安装 PhoneGap.打开终端执行: 1 $ sudo npm install -g phonegap 3.PhoneGap 3 不需要在Xcode中创建,而是在 ...

  4. c++ 函数的函数声明

    c++ 函数的函数声明 只要在被调用函数的首部的末尾加一个分号,就成为对该函数的函数声明.函数声明的位置应当在函数调用之前. #include <iostream> using names ...

  5. Bootstrap 轮播(Carousel)插件

    Bootstrap 轮播(Carousel)插件是一种灵活的响应式的向站点添加滑块的方式.除此之外,内容也是足够灵活的,可以是图像.内嵌框架.视频或者其他您想要放置的任何类型的内容. 如果您想要单独引 ...

  6. Ubuntu/Linux下7款轻量级编辑器 (转)

    From http://www.feiyan.info/39.html 在Windows卧铺使用Zend Studio或者EditPlus写PHP,Zend Studio适合大项目,EditPlus配 ...

  7. Stanford CoreNLP--Split Sentence

    分句功能参考 Stanford Tokenizer. 在edu.stanford.nlp.pipeline包中实现了一系列分词分句功能,其中SentenceAnnotator类实现了对文件分句功能. ...

  8. 实战 SSH 端口转发

    转自实战 SSH 端口转发 通过本文的介绍,读者可以从中了解到如何应用 SSH 端口转发机制来解决日常工作 / 生活中的一些问题.学会在非安全环境下使用端口转发来加密网络应用,保护个人隐私以及重要商业 ...

  9. 3D触控简介:建立数字刻度应用及快速活动栏

    苹果公司通过 iPhone 6s 和 6s Plus 引入了与手机互动的全新方式:按压手势.你也许知道,苹果智能手表和苹果笔记本电脑早已具备这一功能,只是名称略有不同,为力感触控(Force Touc ...

  10. 转贴:C++中指针和引用的区别

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有 ...