ReactiveCocoa 讲解

来源:互联网 发布:社区控烟网络会议记录 编辑:程序博客网 时间:2024/06/05 03:24

1.ReactiveCocoa简介

ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾。

2.ReactiveCocoa作用

  • 在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。
  • 比如按钮的点击使用action,使用delegate,属性值改变使用KVO,通知等系统提供的方式。都可以通过RAC处理
  • ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高内聚,低耦合的思想。

3.ReactiveCocoa编程思想

ReactiveCocoa结合了几种编程风格:

函数式编程(Functional Programming)

响应式编程(Reactive Programming)

所以,ReactiveCocoa被描述为函数响应式编程(FRP)框架。

以后使用RAC解决问题,就不需要考虑调用顺序,直接考虑结果,把每一次操作都写成一系列嵌套的方法中,使代码高聚合,方便管理。

4.编程思想

编程思想:通过开发需求,逐渐形成快速完成这些需求的思想。

目前已知的编程思想

4.1 面向过程:处理事情以过程为核心,一步一步的实现。

4.2 面向对象:万物皆对象。

4.3 链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)

  • 链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)
  • 代表:masonry框架。

4.4 响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

  • 代表:KVO运用。

4.5 函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。

  • 函数式编程本质:就是往方法中传入Block,方法中嵌套Block调用,把代码聚合起来管理
  • 函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)
  • 代表:ReactiveCocoa。

5.如何导入ReactiveCocoa框架

通常都会使用CocoaPods(用于管理第三方框架的插件)帮助我们导入。

注意

  • podfile如果只描述pod ‘ReactiveCocoa’,会导入不成功
111339240-5c1e3c676543ecf4
  • 需要在podfile加上use_frameworks,重新pod install 才能导入成功。
121339240-4a55cd642a1022f5

6.ReactiveCocoa常见类。

学习框架首要之处:先要搞清楚框架中常用的类,在RAC中最核心的类RACSiganl,会用这个类就能用ReactiveCocoa开发了。

  • RACSiganl:信号类,表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。
  • 信号类(RACSiganl),只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。
  • 默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
  • 如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
  • RACSiganl简单使用:

结果如下:

131339240-9e3ba19b23e03f56
  • RACSubscriber:表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。
  • RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
    • 使用场景:不想监听某个信号时,可以通过它主动取消订阅信号。

  • RACSubject:RACSubject:信号提供者,自己可以充当信号,又能发送信号。
    • 使用场景:通常用来代替代理,有了它,就不必要定义代理了。

  • RACReplaySubject:重复提供信号类,RACSubject的子类。
    • RACReplaySubjectRACSubject区别:
      • RACReplaySubject可以先发送信号,再订阅信号,RACSubject就不可以。

    • 使用场景一:如果一个信号每被订阅一次,就需要把之前的值重复发送一遍,使用重复提供信号类。
    • 使用场景二:可以设置capacity数量来限制缓存的value的数量,即只缓充最新的几个值。



  • RACSubject简单使用:

结果如下:

141339240-23f670e7ac0fd467
  • RACReplaySubject的简单使用

结果如下:

151339240-a789c74525866f07

  • RACTuple:元组类,类似NSArray,用来包装值.
  • RACSequence:RAC中的集合类,用于代替NSArray,NSDictionary,可以使用它来快速遍历数组和字典。
    • 使用场景:1.字典转模型


RACSequence和RACTuple简单使用

结果如下:

161339240-dce9c932554b6475

结果如下:

171339240-da1740c378bb51be

  • 字典转模型

  • RACMulticastConnection:用于当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block,造成副作用,可以使用这个类处理。
  • 使用注意:RACMulticastConnection通过RACSignal的-publish或者-muticast:方法创建.

RACMulticastConnection简单使用

结果如下:

181339240-1bc306397845a8cc

  • RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。
  • 使用场景:监听按钮点击,网络请求

RACCommand简单使用

结果如下:

191339240-fac982ea3dd8f862

7.ReactiveCocoa常见宏。

  • RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某个属性绑定。

基本用法

结果如下:

  • RACObserve(self, name):监听某个对象的某个属性,返回的是信号。

基本用法

结果如下:

201339240-f876fef5853461bf

  • @weakify(Obj)和@strongify(Obj),一般两个都是配套使用,解决循环引用问题.
  • RACTuplePack:把数据包装成RACTuple(元组类)

基本用法

结果如下:

211339240-e93f78093aabe96b

  • RACTupleUnpack:把RACTuple(元组类)解包成对应的数据。

基本用法

结果如下:

221339240-9b030afd7f6c2ef8

8.ReactiveCocoa开发中常见用法。

  • 代替代理:
  • rac_signalForSelector:用于替代代理。
  • RACSubject:也用于代理.

结果如下:

  • 代替KVO :
  • rac_valuesAndChangesForKeyPath:用于监听某个对象的属性改变。

结果如下:

  • 监听事件:
  • rac_signalForControlEvents:用于监听某个事件。

结果如下:

  • 代替通知:
  • rac_addObserverForName:用于监听某个通知。

结果如下:

  • 监听文本框文字改变:
  • rac_textSignal:只要文本框发出改变就会发出这个信号。

结果如下:

原创粉丝点击