MVVM. RAC

RAC_1.RACSignal(信号类)

2018-04-04  本文已影响34人  Iris_Fighting

1.RACSignal——信号类

只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。

默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。

RACSignal使用步骤:

1.创建信号 + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe

2.订阅信号,才会激活信号. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
3.发送信号 - (void)sendNext:(id)value

RACSignal底层实现:

1.创建信号,首先把didSubscribe保存到信号中,还不会触发。

2.当信号被订阅,也就是调用signal的subscribeNext:nextBlock

    2.1 subscribeNext内部会调用siganl的didSubscribe

    2.2 subscribeNext内部会创建订阅者subscriber,并且把nextBlock保存到subscriber中。

3.siganl的didSubscribe中调用[subscriber sendNext:@1];

    3.1 sendNext底层其实就是执行subscriber的nextBlock

示例代码:

    //    RACSignal: 信号类,当我们有数据产生,创建一个信号!
    //1.创建信号(冷信号!)
    //didSubscribe调用:只要一个信号被订阅就会调用!!
    //didSubscribe作用:利用subscriber发送数据!!
    RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //3.发送数据subscriber它来发送
        [subscriber sendNext:@"我想静静"];
        
        return nil;
    }];
    
    //2.订阅信号(热信号!!)
    //nextBlock调用:只要订阅者发送数据就会调用!
    //nextBlock作用:处理数据,展示UI界面!
    [signal subscribeNext:^(id x) {
        //x:信号发送的内容!!
        NSLog(@"%@",x);
    }];

1.2.RACDisposable——用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。

示例代码:

    //    RACSignal: 信号类,当我们有数据产生,创建一个信号!
    //1.创建信号(冷信号!)
    //didSubscribe调用:只要一个信号被订阅就会调用!!
    //didSubscribe作用:利用subscriber发送数据!!
    RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //3.发送数据subscriber它来发送
        [subscriber sendNext:@"我想静静"];
        // 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。
        [subscriber sendCompleted];
        return [RACDisposable disposableWithBlock:^{
            // block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
            // 执行完Block后,当前信号就不在被订阅了。
            NSLog(@"信号被销毁");
            
        }];
    }];
    
    //2.订阅信号(热信号!!)
    //nextBlock调用:只要订阅者发送数据就会调用!
    //nextBlock作用:处理数据,展示UI界面!
    RACDisposable * disposable = [signal subscribeNext:^(id x) {
        //x:信号发送的内容!!
        NSLog(@"信号发送的内容%@",x);
    }];
    
    //默认一个信号发送数据完毕就会主动取消订阅
    //只要订阅者在,就不会自动取消订阅
    //手动取消订阅
    [disposable dispose];

如图:


image

1.3.RACSubscriber——订阅者

上一篇下一篇

猜你喜欢

热点阅读