美文网首页ios
ReactiveCocoa的学习(一)

ReactiveCocoa的学习(一)

作者: somesOne | 来源:发表于2016-10-08 23:23 被阅读48次

    1.ReactiveCocoa简介

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

    2.ReactiveCocoa作用

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

    3.编程思想

    在开发中我们也不能太依赖于某个框架,否则这个框架不更新了,导致项目后期没办法维护,比如之前Facebook提供的Three20框架,在当时也是神器,但是后来不更新了,也就没什么人用了。因此我感觉学习一个框架,还是有必要了解它的编程思想

    编程思想的由来:在开发中我们会遇见各种各样的需求,经常会思考如何快速的完成这些需求,这样就会慢慢形成快速完成这些需求的思想。

    先简单介绍下目前咱们已知的编程思想

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

    3.2 面向对象:万物皆对象

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

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

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

    • 代表:KVO运用。

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

    • 函数式编程本质:就是往方法中传入Block,方法中嵌套Block调用,把代码聚合起来管理

    • 函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)

    • 代表:ReactiveCocoa。

    4.ReactiveCocoa编程思想

    ReactiveCocoa结合了几种编程风格:

    函数式编程(Functional Programming)

    响应式编程(Reactive Programming)

    所以,你可能听说过ReactiveCocoa被描述为函数响应式编程(FRP)框架。

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

    5.如何导入ReactiveCocoa框架

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

    PS:CocoaPods教程(http://code4app.com/article/cocoapods-install-usage

    注意
    这里有一点要注意下就是RAC的版本问题,由于还没学习Swift,所以我是用OC编写程序的,最新版的RAC已经支持Swift了,但是在OC的程序安装最新版的RAC可能跑不起来,所以推荐大家使用2.5版本以下的RAC

    6.ReactiveCocoa常见类。

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

    RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。

    • 信号类(RACSiganl),只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。

    • 默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。

    • 如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        // RACSignal:有数据产生的时候,就使用RACSignal
        // RACSignal使用三部曲: 1.创建信号  2.订阅信号 3.发送信号
        
       // 便于理解,我们先拆分block
       // RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
       //      return nil;
       // }];
    
        // 拆分后的block
        RACDisposable *(^didSubscribe)(id<RACSubscriber> subscriber) = ^RACDisposable *(id<RACSubscriber> subscriber) {
            // didSubscribe调用:只要一个信号被订阅就会调用
            // didSubscribe作用:发送数据
            NSLog(@"信号被订阅");
    
            // 3.发送数据
            [subscriber sendNext:@1];
    
            return nil;
        };
        
        // 1.创建信号(冷信号)
        RACSignal *signal = [RACSignal createSignal:didSubscribe];
        
        // 2.订阅信号(热信号)
        [signal subscribeNext:^(id x) {
            
            // nextBlock调用:只要订阅者发送数据就会调用
            // nextBlock作用:处理数据,展示到UI上面
            
            // x:信号发送的内容
            NSLog(@"%@",x);
        }];
        
        '请跳入方法里面看'
        // 只要订阅者调用sendNext,就会执行nextBlock
        // 只要订阅RACDynamicSignal,就会执行didSubscribe
        // 前提条件是RACDynamicSignal,不同类型信号的订阅,处理订阅的事情不一样
    
        // RACSignal底层实现:
        // 1.创建信号,首先把didSubscribe保存到信号中,还不会触发。
        // 2.当信号被订阅,也就是调用signal的subscribeNext:nextBlock
        // 2.2 subscribeNext内部会创建订阅者subscriber,并且把nextBlock保存到subscriber中。
        // 2.1 subscribeNext内部会调用siganl的didSubscribe
        // 3.siganl的didSubscribe中调用[subscriber sendNext:@1];
        // 3.1 sendNext底层其实就是执行subscriber的nextBlock
    
    
        // 1.创建信号
        RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    
            // block调用时刻:每当有订阅者订阅信号,就会调用block。
    
            // 2.发送信号
            [subscriber sendNext:@1];
    
            // 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。
            [subscriber sendCompleted];
    
            return [RACDisposable disposableWithBlock:^{
    
                // block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
    
                // 执行完Block后,当前信号就不在被订阅了。
    
                NSLog(@"信号被销毁");
    
            }];
        }];
    
        // 3.订阅信号,才会激活信号.
        [siganl subscribeNext:^(id x) {
            // block调用时刻:每当有信号发出数据,就会调用block.
            NSLog(@"接收到数据:%@",x);
        }];
    

    相关文章

      网友评论

        本文标题:ReactiveCocoa的学习(一)

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