RAC初识

2017-12-19  本文已影响0人  锦鲤跃龙

简介

简单的说,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);
       
   }];

执行过程

查看源码可以知道其执行过程如下


WX20171218-221342@2x.png

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
上一篇 下一篇

猜你喜欢

热点阅读