美文网首页
ReactiveCocoa基本用法(适合初学者)持续更新...

ReactiveCocoa基本用法(适合初学者)持续更新...

作者: 行走的菜谱 | 来源:发表于2018-08-25 14:55 被阅读178次

    github文章链接

    文章前言

    一般在使用一个框架之前需要了解的事情,也就是需要了解的东西,本人总结了一下有下面几点(比较浅显,欢迎喷口水):

    1. 这个框架有什么用,即这个框架能够给我带来什么作用
    2. 怎么集成这个框架
    3. 框架的使用方法

    下面就从这几个点展开


    一、这个框架有什么用,即这个框架能够给我带来什么作用

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

    二、 怎么集成这个框架(这里只介绍cocoaPods的集成方法)

    • OC版的ReactiveCocoa(下面简称RAC)集成方法
    pod 'ReactiveObjC'或者pod 'ReactiveObjC', '~> 指定版本'
    
    • swift版的ReactiveCocoa集成方法
    pod 'ReactiveCocoa'或者pod 'ReactiveCocoa', '~> 指定版本'
    

    相信集成这个框架对于一个iOS开发者来说并不是什么难事,下面就介绍框架的几种常用方法废话不多说直接上代码

    三、框架的使用方法

    1. RACSignal框架中最常用的一个类
    • RACSiganl:信号类,表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据
    • 默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
    • 如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
    2. RACSignal使用步骤
    • 创建信号
    + (RACSignal *)createSignal:(RACDisposable * (^)(id subscriber))didSubscribe
    

    当然还有其他的创建方法,可以自行尝试

    • 订阅信号,才会激活信号
    - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
    
    • 发送信号
    - (void)sendNext:(id)value
    

    这里发送信号的入参value,可以是网络请求的返回值,以及各种你想要传递出去的东西

    上代码

    //1.创建信号
        RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
     
            //保存起来 就不会被取消订阅
            _subscriber = subscriber;
            //3.发送信号
            [subscriber sendNext:@1];
     
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"默认信号发送完毕被取消");
            }];
     
        }];
     
        //如果要取消就拿到 RACDisposable
        //2.订阅信号
        RACDisposable *disposable = [signal subscribeNext:^(id x) {
     
            NSLog(@"%@",x);
        }];
     
        //取消订阅
        [disposable dispose];
    }
    

    看过上面的方法,再来看一波网络请求的使用方法

     [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            // 这里进行一个网络请求
            DELAY(1000000000000);
            // 如果请求成功就发送next和complete事件,如果失败就发送error事件
            [subscriber sendNext:@"第一个任务"];
            // 这里记住一定要调用sendCompleted方法,因为不调用完成这个方法,信号就不会销毁,一直占用着内存,这个是开发者们最不希望看到的
            [subscriber sendCompleted];
            //        [subscriber sendError:nil];
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"默认信号发送完毕后就会被销毁,没有订阅者的时候就会被销毁");
            }];
        }];
    

    到这里,我觉得RACSignal信号类的使用方法应该能够掌握了,这里讲解一下代码里用到的一些类和协议

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

    使用场景:不想监听某个信号时,可以通过它主动取消订阅信号。

    3. 回看到文章的开头,RAC的作用第二点

    比如按钮的点击使用action,使用delegate,属性值改变使用KVO,通知等系统提供的方式。都可以通过RAC处理

    下面就介绍一些常用的用法不仅可以节约开发时间,而且可以使逻辑代码更加的集中,举个例子:给按钮添加一个target,首先需要addtarget,然后需要写一个方法实现,其实系统的也不麻烦,但是RAC给我们提供了更加快捷的方案,请看表演:

    /**
     按钮的点击事件
     */
    - (void)addButtonTarget {
        UIButton *loginButton = [[UIButton alloc] init];
        loginButton.backgroundColor = [UIColor grayColor];
        loginButton.frame = CGRectMake(150, 220, 100, 100);
        [self.view addSubview:loginButton];
        
        [[loginButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
            NSLog(@"%@", x);
        }];
    }
    

    想必看到这里大家应该能够看到快捷的地方了,不用添加target,不用再定义一个方法!这个解释一下代码

    • rac_signalForControlEvents这个方法的返回值其实是一个信号类,即RACSignal类,再会看到上面提到的RACSignal的使用方法,先创建信号,其实这里内部就会创建一个信号并且返回
    • subscribeNext这里就是订阅信号了
    • 最后发送信号,你可以在subscribeNext的block里面看到,里面的参数,其实就是点击按钮传递出来的值,可以理解为信号携带的值

    这里再举一个例子:监听文本输入框事件。相信大家在开发中经常会遇到需要监听文本框,以此来对付产品提出的各种逆天并且领先科技N年的想法,通常做法都是addtarget,或者delegate,实现各种代理方法,这里使用RAC可以达到异曲同工的效果,上代码:

    /**
     监听文本框的输入
     */
    - (void)textFieldChange {
        UITextField *textFidle = [[UITextField alloc] init];
        textFidle.frame = CGRectMake(100, 100, 200, 40);
        textFidle.backgroundColor = [UIColor grayColor];
        [self.view addSubview:textFidle];
        
        // 监听文本框的输入,而且只有大于3个长度的时候才会打印
        [[textFidle.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
            return value.length > 3;
        }]
         subscribeNext:^(NSString * _Nullable x) {
             NSLog(@"%@", x);
         }];
    }
    

    这里讲解一下代码

    • textFidle.rac_textSignal这里会返回一个信号,直接订阅该信号就可以拿到输入框里的内容了
    • 这里可以看到有一个新的东西filter,这个可以理解为筛选过滤的意思,需要返回一个bool值,即只有返回YES的时候subscribeNext,这个block才会调用,可以理解为只有给出通行证,才可以继续往下面执行,filter返回的还是一个RACSignal类
    后续更新内容
    1. 结合实际开发场景,使用RAC解决输入框,按钮点击联动逻辑
    2. 组合信号的使用方法以及使用场景
    3. 快速解决多个任务需要按照顺序执行的需求
    4. 在开发中经常需要执行多个请求,然后再执行后续的任务(让你不再使用GCD中的任务调度组)
    5. 在开发中共需要按照顺序执行多个请求,帮助你更好的解决问题
    6. 网络请求的封装(RACCommand)
    7. 代理的使用方法

    最后感谢所有能够看到末尾的人,如有写的不对的地方可以随时指出,欢迎加群QQ交流:578068845

    相关文章

      网友评论

          本文标题:ReactiveCocoa基本用法(适合初学者)持续更新...

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