您的当前位置:首页正文

ReactiveCocoa学习-(三)

来源:花图问答

通过cocopods导入ReactiveCocoa到工程中

1. RACSignal 和 RACDisposable

#import "ViewController.h"
#import "ReactiveCocoa.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // RACSignal: 有数据产生的时候, 就使用RACSignal
    
    // RACSignal使用步骤: 1.创建信号  2.订阅信号 3.发送信号
    
    
    
    // 1.创建信号(冷信号)
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 这个block->didSubscribe调用: 只要一个信号被订阅就会调用
        // 这个block->didSubscribe作用: 发送数据
        
        NSLog(@"信号被订阅了");
       // 3. 发送信号 (订阅者发送消息)
        [subscriber sendNext:@"这是订阅者发送的信息"];
    
        return [RACDisposable disposableWithBlock:^{
            // 只要信号取消订阅就会来到这里 (默认一个信号发送完毕就会自动取消订阅) -> 只要订阅者在, 这个信号就不会被自动取消
            // 一般用于清空资源
            NSLog(@"信号被取消订阅了");
            
        }];
    }];
    
    // 2.订阅信号(热信号)
    [signal subscribeNext:^(id x) {
        // 这个block->nextBlock调用: 只要订阅者发送数据就会调用
        // 这个block->nextBlock作用: 处理数据, 展示到UI上面
        
        
        // x: 信号发送的内容
        NSLog(@"%@", x);
        
    }];
}


/**
 *  只要订阅者调用sendNext, 就会执行nextBlock
 *  只要RACDynamicSignal信号被订阅, 就会执行didSubscribe
 *  前提条件是RACDynamicSignal, 不同类型的订阅,处理订阅的事情不一样
 */
  • 默认一个信号发送完毕就会自动取消订阅(只要订阅者在, 这个信号就不会被自动取消), 如果我们不想让它自动取消订阅, 我们可以用一个强引用的属性来记录这个订阅者, 这样就不会进自动取消订阅的block中了
  • 如果我们想手动取消订阅, 则订阅信号的方法- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock会返回一个RACDisposable对象, 我们可以调用这个对象的[disposabel dispose]方法来手动取消订阅

手动取消订阅

@interface ViewController ()

@property (nonatomic, strong) id<RACSubscriber> subscriber;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.创建信号(冷信号)
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 强引用订阅者, 不自动取消订阅
        _subscriber = subscriber;
        
        NSLog(@"信号被订阅了");
       // 3. 发送信号 (订阅者发送消息)
        [subscriber sendNext:@"这是订阅者发送的信息"];
    
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"信号被取消订阅了");
            
        }];
    }];
    
    // 2.订阅信号(热信号)
    RACDisposable *disposabel = [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    
    // 手动取消订阅
    [disposabel dispose];
}

2. RACSignal 和 RACDisposable