美文网首页
ReactiveCocoa学习

ReactiveCocoa学习

作者: 城市之光 | 来源:发表于2016-08-25 21:49 被阅读70次

    1.ReactiveCocoa是什么?
    ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,是一套基于Cocoa的FRP框架即函数响应式响应式编程,其优点是用随时间改变的函数表示用户输入,这样就不需要可变状态了。。

    2.导入ReactiveCocoa框架
    这里使用CocoaPods来导入
    打开终端,进入工程文件的同级目录
    新建一个profile文件或在原来的该文件上,输入以下内容并保存
    use_frameworks!
    pod 'ReactiveCocoa', '~> 2.5'

    3.什么是冷信号与热信号
    冷热信号的概念源于.NET框架Reactive Extensions(RX)中的Hot Observable和Cold Observable,两者的区别是:
    3.1 Hot Observable是主动的,尽管你并没有订阅事件,但是它会时刻推送,就像鼠标移动;而Cold Observable是被动的,只有当你订阅的时候,它才会发布消息。
    3.2 Hot Observable可以有多个订阅者,是一对多,集合可以与订阅者共享信息;而Cold Observable只能一对一,当有不同的订阅者,消息是重新完整发送。
    这里面的Observables可以理解为RACSignal。

    Snip20150825_3.png

    以上简单地创建了一个信号,并且依次发送@1,@2,@3作为值。下面分别有两个订阅者在不同的时间段进行了订阅,运行的结果如下:

    2015-08-25 17:14:21.338 MVVM[3083:94636] Signal was create.
    2015-08-25 17:14:21.440 MVVM[3083:94636] Subcriber 1 reveive: 1
    2015-08-25 17:14:21.441 MVVM[3083:94636] Subcriber 1 reveive: 2
    2015-08-25 17:14:21.441 MVVM[3083:94636] Subcriber 1 reveive: 3
    2015-08-25 17:14:22.435 MVVM[3083:94636] Subcriber 2 reveive: 1
    2015-08-25 17:14:22.436 MVVM[3083:94636] Subcriber 2 reveive: 2
    2015-08-25 17:14:22.436 MVVM[3083:94636] Subcriber 2 reveive: 3

    例外修改下代码如下

    Snip20150825_2.png

    2015-08-25 17:23:46.418 MVVM[3232:100902] Signal was created.
    2015-08-25 17:23:48.512 MVVM[3232:100902] Subcriber 1 receive: 2
    2015-08-25 17:23:49.625 MVVM[3232:100902] Subcriber 1 receive: 3
    2015-08-25 17:23:49.625 MVVM[3232:100902] Subscriber 2 recveive: 3

    上面代码
    1.我创建了一个信号,在1秒、2秒、3秒分别发送1、2、3这三个值,4秒发送结束信号。
    2.对这个信号调用publish方法得到一个RACMulticastConnection。
    3.让connection进行连接操作。
    4.获得connection的信号。
    5.分别在1.1秒和2.1秒订阅获得的信号。

    首先- [RACSignal publish]、- [RACMulticastConnection connect]、- [RACMulticastConnection signal]这几个操作生成了一个热信号。

    冷热信号的如下特点:
    1.热信号是主动的,即使你没有订阅事件,它仍然会时刻推送。如第二个例子,信号在46秒被创建,47秒的时候1这个值就推送出来了,但是当时还没有订阅者。而冷信号是被动的,只有当你订阅的时候,它才会发送消息。如第一个例子。
    2.热信号可以有多个订阅者,是一对多,信号可以与订阅者共享信息。如第二个例子,订阅者1和订阅者2是共享的,他们都能在同一时间接收到3这个值。而冷信号只能一对一,当有不同的订阅者,消息会重新完整发送。如第一个例子,我们可以观察到两个订阅者没有联系,都是基于各自的订阅时间开始接收消息的。

    4.为什么要区分冷热信号
    我们来分析副作用与冷热信号的关系。既然iOS编程中少不了副作用,那么RAC在实际的使用中也不可避免地要接触副作用。下面通过一个业务场景,来看看冷信号中副作用的坑:

    Snip20150825_4.png Snip20150825_5.png

    如果你去尝试运行这段代码,你会惊奇的发现,这个网络请求发送了3次。没错,是3次请求。我们也可以想象到类似的代码存在其他副作用的问题,重新刷新了3次tableView。

    下面来分析,为什么是3次网络请求呢?首先根据上面的知识,可以推断出名为fetchData信号是一个冷信号。那么这个信号在订阅的时候就会执行里面的过程。那这个信号是在什么时候被订阅了呢?仔细回看了代码,我们发现并没有订阅这个信号,只是调用这个信号的flattenMap产生了两个新的信号。

    这里有一个很重要的概念,就是任何的信号转换即是对原有的信号进行订阅从而产生新的信号。

    导致3次网络请求的原因就是flattenMap中会对原有的fetchData信号进行订阅。

    由此可以看到,不熟悉冷热信号对业务造成的影响。我们可以想象对用户流量的影响,对服务器负载的影响,对统计的影响,如果这是一个点赞的接口,会不会造成多次点赞?后果不堪设想啊。而这些都可以通过将fetchData转换为热信号来解决。

    5.怎么处理冷信号与热信号

    待续。。。

    相关文章

      网友评论

          本文标题:ReactiveCocoa学习

          本文链接:https://www.haomeiwen.com/subject/kssdkttx.html