RAC主要信号类学习

一,RACSignal


//1,创建一个冷信号,这个时候会把代码存储到block中,当第二步订阅信号的时候会调用block内容(如果需要传递数据过去,用subscriber进行即可,如下)    

RACSignal *signal = [RACSignal createSignal:^RACDisposable *(idsubscriber) {

NSLog(@"ok, excute me");

[subscriber sendNext:@"I am the subscriber sending message"];

return  nil;

}];

//2,订阅信号,使冷信号变热信号,这个时候会调用之前保存的代码并执行block

[signal subscribeNext:^(id x) {

NSLog(@"I got a message from subscriber");

//x是信号中传递过来的信息

NSLog(@"%@",x);

}];

二,RACDisposal

1,RACDisposal会自动取消订阅

    //RACDisposal(用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候就会自动触发)
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
        //这里需要注意一下,RACSubscriber是一个协议,只要遵守协议就可以成为订阅者
        
        NSLog(@"ok,这里是暂时保存的block");
        [subscriber sendNext:@"发送数据"];
        
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"在这里自动取消订阅,清空资源等等");
            //如果不想在这个时候取消而是需要在特定时刻手动取消订阅,需要强引用subscriber这个对象
        }];
        
    }];
    
    [signal subscribeNext:^(id x) {
       
        //订阅之后就可以接收数据了
        NSLog(@"%@",x);
        
    }];

2,RACDisposal手动取消订阅

   //1,创建信号并强引用subscriber
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
        //这里需要注意一下,RACSubscriber是一个协议,只要遵守协议就可以成为订阅者
        self.subscriber = subscriber;
        
        NSLog(@"ok,这里是暂时保存的block");
        [subscriber sendNext:@"发送数据"];
        
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"手动取消订阅,会来到这里,清空资源等等");
        }];
        
    }];
    
    //2,取出订阅方法返回值
    RACDisposable *disposable = [signal subscribeNext:^(id x) {
        
        //订阅之后就可以接收数据了
        NSLog(@"%@",x);
    }];
    
    //3,用订阅返回值手动取消订阅
    [disposable dispose];

三,RACSubject
/*
RACSubject之所以发送数据,是因为它遵守了,作为一个遵守了协议的RACSignal的子类,所以说它既可以创建信号,自身又可以发送数据
*/

    //1,创建信号
    RACSubject *subject = [RACSubject subject];
    
    //2,订阅信号
    [subject subscribeNext:^(id x) {
        NSLog(@"订阅者01接收到数据------%@",x);
    }];
    [subject subscribeNext:^(id x) {
        NSLog(@"订阅者02接收到数据------%@",x);
    }];
    
    //3, 发送信号数据
    [subject sendNext:@"ok, message send"];

四,RACReplaySubject

  • /*
    
    RACReplaySubject和RACSubject的不同之处在于:
    1,RACReplaySubject在发送信号数据的时候只是保存block,并没有遍历自身的订阅着执行block,而RACSubject在发送数据的时候就已经遍历了自身订阅者执行block
    2,因此,RACSubject必须要在发送数据的之前创建订阅者,也就是需要在发送数据之前订阅信号(订阅信号的时候创建订阅者),而RACReplaySubject则可以先发送数据,之后再订阅信号,因为它在发送数据的时候只是保存block,真正调用时在订阅者创建之后才会重新激活调用发送数据的block
    */
    //1,创建信号
    RACReplaySubject *replaySubject = [RACReplaySubject subject];
    
    //4,也可以先发送数据
    [replaySubject sendNext:@"先发送数据,后订阅也可以"];
    
    //2,订阅信号
    [replaySubject subscribeNext:^(id x) {
        NSLog(@"订阅者01接受到数据----%@",x);
    }];
    [replaySubject subscribeNext:^(id x) {
        NSLog(@"订阅者02接受到数据----%@",x);
    }];
    //3, 发送信号数据
    [replaySubject sendNext:@"ok, message send"];

你可能感兴趣的:(RAC主要信号类学习)