zoukankan      html  css  js  c++  java
  • 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:跳过几个信号,不接受
  • 相关阅读:
    Serilog 动态添加自定义属性
    C# 序列化与反序列化
    幂等设计
    服务无状态
    vue 显示 mysql 数据库表 Demo
    C# 调用 linux 函数 —— Linux 头文件目录位置
    创建可以在 Zynq 上运行的动态库
    C# 获取所在函数名
    Linux 关闭终端不结束进程
    C# 自动生成版本号
  • 原文地址:https://www.cnblogs.com/coderwjq/p/6198904.html
Copyright © 2011-2022 走看看