美文网首页
RAC框架源码解析之RACDisposable

RAC框架源码解析之RACDisposable

作者: Jimi | 来源:发表于2018-04-20 01:13 被阅读35次

    1、RACDisposable

    RACDisposable它是帮助我们取消订阅,信号发送完毕或者失败都需要取消订阅,有点类似于通知,当你发送通知的时候,就得删除通知。

        //1.创建信号(冷信号)
        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            //3.发送信号
            [subscriber sendNext:@"我在发送信号"];
            
            return [RACDisposable disposableWithBlock:^{
                //只要信号取消订阅就会进入这个block
                NSLog(@"取消订阅了");
            }];
        }];
        
        //2.订阅信号(热信号)
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"订阅信号 %@", x);
        }];
    

    在下段代码中我们看到 RACDisposable 有一个类方法 disposableWithBlock,用户取消了订阅就会进入这个block,也就是说一个信号发送数据完毕就会主动取消订阅,如果你用一个属性引用了subscriber那么这个订阅就不会取消,因为只要有订阅者在,就不会自动取消订阅。代码如下

    //
    //  ViewController.m
    //  RAC的简单使用以及应用场景
    //
    //  Created by JM on 2018/4/19.
    //  Copyright © 2018年 JM. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <ReactiveObjC/ReactiveObjC.h>
    
    @interface ViewController ()
    
    /** subscriber */
    @property (nonatomic, strong) id <RACSubscriber>subscriber;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //1.创建信号(冷信号)
        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            //3.发送信号
            [subscriber sendNext:@"我在发送信号"];
            //引用subscriber(这个时候下面的block代码块就不会走)
            self.subscriber = subscriber;
            
            return [RACDisposable disposableWithBlock:^{
                //只要信号取消订阅就会进入这个block
                NSLog(@"取消订阅了");
            }];
        }];
        
        //2.订阅信号(热信号)
        [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"订阅信号 %@", x);
        }];
        
        
    }
    
    
    @end
    

    如何手动取消订阅

    //
    //  ViewController.m
    //  RAC的简单使用以及应用场景
    //
    //  Created by JM on 2018/4/19.
    //  Copyright © 2018年 JM. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <ReactiveObjC/ReactiveObjC.h>
    
    @interface ViewController ()
    
    /** subscriber */
    @property (nonatomic, strong) id <RACSubscriber>subscriber;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //1.创建信号(冷信号)
        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            //3.发送信号
            [subscriber sendNext:@"我在发送信号"];
            self.subscriber = subscriber;
            
            return [RACDisposable disposableWithBlock:^{
                //只要信号取消订阅就会进入这个block
                NSLog(@"取消订阅了");
            }];
        }];
        
        //2.订阅信号(热信号)
        RACDisposable *disposable = [signal subscribeNext:^(id  _Nullable x) {
            NSLog(@"订阅信号 %@", x);
        }];
        
        //因为有订阅者在, 所有手动取消订阅
        [disposable dispose];
    }
    @end
    
    

    2、RACSubscriber

    这里简要说明RACSubscriber是一个信号的订阅者,后续会有详细说明。

    demo源代码已放置GitHub地址https://github.com/JunAILiang/RAC_Demo

    联系我:
    qq: 1245424073
    微信: liujunmin6980

    相关文章

      网友评论

          本文标题:RAC框架源码解析之RACDisposable

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