RAC初识

来源:互联网 发布:看电视直播的软件 编辑:程序博客网 时间:2024/05/17 07:50

简介

简单的说,RAC就是一个第三方库,他可以大大简化你的代码过程。

官方的说,ReactiveCocoa(其简称为RAC)是由GitHub开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程和响应式编程的特性。
RAC在某些特定情况下开发时可以大大简化代码,并且目前来看安全可靠。

RAC常见的类

RACSignal:信号类

    //1.创建信号    /*     didSubScriber调用:只要一个信号被订阅就调用!     didSubScriber作用:利用subscriber 来发送数据!     didSubScriber能否执行,取决于信号是否被订阅     */    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {        NSLog(@"Block被执行!");        //3.发送信号        [subscriber sendNext:@"Hello,LIYANJUN!"];        return nil;    }];    //2.订阅信号(热信号)    /*     nextBlock调用:只要订阅者发送数据、信号就会被调用     nextBlock作用:处理数据、展示UI     nextBlock是否被调用,取决于订阅者是否发送了信号     */    [signal subscribeNext:^(id x) {        //x:信号发送的内容        NSLog(@"%@",x);    }];

执行过程

查看源码可以知道其执行过程如下
这里写图片描述

RACDisposable:它是帮助我们取消订阅!

什么时候取消订阅

  1. 信号发送完毕;
  2. 信号发送失败;
1. 默认一个信号发送完毕后,就会主动取消订阅2. 只有订阅者存在,就不会取消订阅 3. 可以手动取消订阅   RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {        NSLog(@"Block被执行!");        //3.发送信号        [subscriber sendNext:@"Hello,LYJ!"];        self.subScriber = subscriber;//强引用,防止block执行完毕后释放,执行取消        return [RACDisposable disposableWithBlock:^{            //只有信号取消订阅,就会执行这里            NSLog(@"订阅被取消!");        }];    }];   RACDisposable *disposable =  [signal subscribeNext:^(id x) {        //x:信号发送的内容        NSLog(@"%@",x);    }];    [disposable dispose];

RACSubject:信号提供者:自己可以充当信号,又能发送信号

//1.创建信号    RACSubject *subject = [RACSubject subject];    //2.订阅信号    //不同的信号,订阅方式不一样(因为类型不一样,所以调用方法不一样)    //RACSubject 处理订阅:拿到之前的_subScribers数组,保存订阅者    [subject subscribeNext:^(id  _Nullable x) {        NSLog(@"程序员“不高兴”同学,接收到祝福:%@",x);    }];    [subject subscribeNext:^(id  _Nullable x) {        NSLog(@"程序员“xXuTeng”同学,接收到祝福:%@",x);    }];    [subject subscribeNext:^(id  _Nullable x) {        NSLog(@"程序员“随遇而安”同学,接收到祝福:%@",x);    }];    //3.发送数据    //遍历出所有的数据,调用nextBlock    [subject sendNext:@"1024 程序员节快乐!身体健康!万事如意~~~~~"];

信息流

WX20171219-165846@2x.png

RACReplaySubject

他是RACSubject的子类,RACReplaySubject可以先发送信号,再订阅信号;RACSubject就不可以。

//1.创建信号    RACReplaySubject *subject = [RACReplaySubject subject];    //3.发送信号    [subject sendNext:@"Hello"];    //2.订阅信号    [subject subscribeNext:^(id  _Nullable x) {        NSLog(@"%@",x);    }];    //2.订阅信号    [subject subscribeNext:^(id  _Nullable x) {        NSLog(@"12312314%@",x);    }];

他为什么可以提前发送信号,下图可以很好的解释。
在发送信号的时候,她会把数据保存一份,然后订阅信号的时候,她会遍历valuesReceived,只要有发送者,就发送数据

WX20171220-152836@2x.png

原创粉丝点击