RAC初识

简介

简单的说,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值