美文网首页
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