RACSignal的基本方法说明

2019-05-14  本文已影响0人  Bepawbikvy
1、RACSignal的创建:
// 1_1、创建信号 + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe
// 1_2、订阅信号,才会激活信号. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
// 1_3、发送信号 - (void)sendNext:(id)value

// 1.创建信号
RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    
    // block调用时刻:每当有订阅者订阅信号,就会调用block。
    
    // 2.发送信号
    [subscriber sendNext:@1];
    
    // 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。
    [subscriber sendCompleted];
    
    return [RACDisposable disposableWithBlock:^{
        
        // block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
        
        // 执行完Block后,当前信号就不在被订阅了。
        
        NSLog(@"信号被销毁");
        
    }];
}];

// 3.订阅信号,才会激活信号.
[siganl subscribeNext:^(id x) {
    // block调用时刻:每当有信号发出数据,就会调用block.
    NSLog(@"接收到数据:%@",x);
}];

RACSignal底层实现:
// 1.创建信号,首先把didSubscribe保存到信号中,还不会触发。
// 2.当信号被订阅,也就是调用signal的subscribeNext:nextBlock
// 2.2 subscribeNext内部会创建订阅者subscriber,并且把nextBlock保存到subscriber中。
// 2.1 subscribeNext内部会调用siganl的didSubscribe
// 3.siganl的didSubscribe中调用[subscriber sendNext:@1];
// 3.1 sendNext底层其实就是执行subscriber的nextBlock

2、信号的处理
2_1、subscribeNext,将事件流传递给下一个subscriber。
2_2、filter,用来做一些条件判断、筛选。返回值是BOOL。
2_3、map,用来转化事件数据类型,比如NSString转成NSNumber。
2_4、RAC(self.passwordTextField, backgroundColor),绑定属性作为数据的返回类型。
2_5、combineLatest,合并多个信号,combineLatest:@[self.phoneNameRegexSig,self.passwordRegexSig]。
2_6、rac_signalForControlEvents,绑定控制事件,用于UIButton等。
2_7、createSignal,创建信号。
2_8、flattenMap,简化了一步操作,本来是信号A转成信号B调用subscribeNext,B变成了subscribeNext的x;使用flattenMap后,B里面的事件流直接传给了x。
2_9、doNext,事件发生时处理的逻辑,放在rac_signalForControlEvents之后。
2_10、RACDisposable,手动移除事件流。
2_11、then,等待网络时间处理回调,有效地将控制从一个信号传递给下一个。传递error事件。
2_12、deliverOn:[RACScheduler mainThreadScheduler]]转到主线程。
2_13、RACScheduler *scheduler subscribeOn:scheduler异步调用。
2_14、throttle间隔操作,间隔几秒后执行信号。
3、注意事项
3_1、使用@weakify(self)避免循环引用和使用@strongify(self)保存住self对象。
3_2、信号创建之后,需要使用subscribeNext传递事件流,才能使代码执行。
上一篇下一篇

猜你喜欢

热点阅读