• ReactiveCocoa框架学习1


    写block直接使用inline

    block的声明类型

    • 在ARC中使用strong,如果不使用strong,则会被销毁
    • 在非ARC中使用copy

    block在开发中的使用场景

    • 把block保存到对象中,在恰当的时候才去调用
    • 把block当做方法的参数使用,外界不调用,都是方法内部去调用,block实现交给外界决定
    • 把block当做方法的返回值,目的就是为了代替方法,block交给内部实现,外界不需要知道block怎么实现,只管调用

    ReactiveCocoa

    • 简介:rac是由github开源的应用于iOS和OS开发的新框架
    • 作用:可以把要监听的事情和要处理的事情的代码放在一起,方便管理,就不需要跳到对应的方法里.
    • 优点:符合开发中高聚合,低耦合的思想

    编程思想

    • 面向过程
    • 面向对象
    • 链式编程思想
      • 代表:masonry框架
      • 使用约束的步骤:先添加控件,再设置约束
      • 链式编程思想的特点:方法返回值必须是方法的调用者
      • block:把需要操作的值当做block参数,block也需要返回值,就是方法调用者
      • mas_makeConstraints执行流程:
        • 创建约束制造者MASContraintMaker,绑定控件,生成了一个保存所有约束的数组
        • 执行mas_makeConstraints传入进行的block
        • 让约束制造者安装约束,清空之前的所有约束,遍历约束数组,一个一个安装
    • 响应式编程思想
      • 不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些时间像流一样的传播出去,然后影响结果,万物皆是流
      • 代表:KVO运用
    • 函数式编程思想
      • 把操作尽量写成一系列嵌套的函数或者方法调用.
      • 本质:往方法中传入block,方法中嵌套block调用,把代码聚合起来管理
      • 特点:每个方法必须有返回值(对象本身),吧函数或block当做参数,block参数(需要操作的值),block返回值(操作结果)
      • 代表:ReactiveCocoa

    KVO的底层实现

    • KVO的本质:就是监听一个对象有没有调用set方法
    • 监听方法的本质:并不需要修改方法的实现,仅仅想判断下有没有调用
    • 自定义NSKVONotifying_Person子类
    • 重写setName方法,在内部调用super方法,恢复父类做法,通知观察者
    • 如何让外界调用自定义Person类的子类?修改当前对象的isa指针,指向NSKVONotifying_Person

    RAC编程思想

    • rac结合了几种编程风格:
      • 函数式编程(Functional Programming)
      • 响应式编程(Reactive Programming)
    • rac被描述为函数响应式编程(FRP)框架
    • 以后使用rac解决问题,就不需要考虑调用顺序,直接考虑结果,把每一次操作都写成一系列嵌套的方法,使代码高聚合,方便管理

    RAC常见类

    • RACSignal:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据
    • RACSignal使用步骤:
      • 创建信号(冷信号)
      • 订阅信号(热信号)
      • 发送数据(要在订阅信号后)
    • didSubscribe调用:只要一个信号被订阅就会调用,作用是发送数据
    • nextBlock调用:只要订阅者发送数据就会调用,作用是处理数据,展示到UI上面
    • 只要订阅者调用sendNext,就会执行nextBlock
    • 只要订阅RACDynamicSignal,就会执行didSubscribe
    • 前提条件是RACDynamicSignal,不同类型信号的订阅,处理订阅的事情不一样

    • RACDisposable:只要信号取消订阅,就会来到didSubscribe中return的block
    • 默认一个信号在发送数据完毕就会主动取消订阅
    • 只要订阅者在,就不会自动取消信号订阅
    • 手动取消订阅信号[disposable dispose]

    • RACSubject:信号提供者,自己可以充当信号,又能发送信号
    • 使用场景:通常用来代替代理,有了它就不必要定义代理了
    • 使用步骤:
      • 创建RACSubject信号,底层会创建订阅者数组
      • 订阅信号,将订阅者添加到订阅者数组
      • 发送数据,遍历订阅者数组,分别调用订阅者对应的nextBlock

    • RACReplaySubject:重复提供信号类,RACSubject的子类
    • 区别:RACReplaySubject可以先发送信号,再订阅信号
    • RACSubject则不可以
    • 底层实现:
      • 创建RACReplaySubject信号,底层会创建订阅者数组和值数组
      • 调用sendNext发送信号,把值保存起来,然后遍历刚刚保存的所有订阅者,依次调用订阅者的nextBlock
      • 调用subscribeNext订阅信号,遍历保存的所有值,依次调用订阅者的nextBlock

    RACSubject替换代理

    • 在第二个控制器.h中,添加一个RACSubject代替代理(创建信号)
    • 监听第二个控制器按钮的点击,判断代理信号是否有值,如果有值,才需要通知(发送信号)
    • 在第一个控制器中,监听跳转按钮,订阅代理信号

    RAC集合

    • RACTuple:元组
    • RACSequence:集合
      • 定义数组
      • 将数组转为RAC集合
      • 订阅集合信号,内部会自动遍历所有的元素并发送信号

    RAC在开发中的常见用法

    • 代替代理
      • RACSubject:需要传参数的时候使用
      • rac_signalForSelector:不需要传参数的时候使用
    • 代替KVO
      • rac_valuesAndChangesForKeyPath:用于监听某个对象的属性改变
    • 监听事件
      • rac_signalForControlEvents:用于监听某个事件
    • 代替通知
      • rac_addObserverForName:用于监听某个通知
    • 监听文本框文字改变
      • rac_textSignal:只要文本框发生改变就会发出这个信号
    • 处理当界面有多次请求时,需要都获取到数据时才能展示界面
      • rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去出发第一个selector参数的方法
      • 注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据
  • 相关阅读:
    获取成本
    销售订单跟踪成本
    装机
    这就是用战术上的勤奋掩盖战略上的懒惰
    CPA-计划(参考)
    大帝名言
    BZOJ 2100: [Usaco2010 Dec]Apple Delivery spfa
    BZOJ 2834: 回家的路 Dijkstra
    BZOJ 4070: [Apio2015]雅加达的摩天楼 根号分治+spfa
    BZOJ 4152: [AMPPZ2014]The Captain Dijkstra+贪心
  • 原文地址:https://www.cnblogs.com/coderwjq/p/6198897.html
Copyright © 2020-2023  润新知