RAC中的rac_textSignal浅析

这个地方想了很久,也去测试打印了一下,目前水平有限只能简单的说明下过程当我们使用了RAC去实时的监听文本框的变化,代码如下

 RACSignal * signal1 = [_textField1 rac_textSignal];
    [signal1 subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];

首先我们要先去查看下面的这个方法,这里就是将两个信号组合成一个信号,按照顺序的去执行每个信号发送信号完毕之后的执行,就比如有A信号和B信号合并成C信号。然后先让A信号处理完再让B信号去处理。



我们点进去看实现concat方法的实现,我们就会发现如果是两个信号的组合,那么其实就是先让A信号去订阅自己的消息也就是self subscribeNext,然后再去调用subscriber给新的信号C去发送消息,然后C信号在外面订阅就可以进行处理,如果订阅完成之后,我们再去让B信号去执行它的didSubscribe(subscriber)也就是我们在createSignal后面的那个block,然后这里给B信号的subscribe:方法传入的的subscriber还是我们创建新信号中的订阅者。所以C信号可以直接收到消息之后进行处理。

而在这里面的一个方法中需要注意的是那个[subscriber sendNext:x]的方法,这个方法中的x其实就是我们的textField,也就是说这里还把x发送给了外面的rac_textSignal但是外面没有打印出来,内部肯定是做了处理的,而且我们会发现我们在使用了下面这个方法的时候不管文本框的值有没有改变刚开始都会打印一次。其实就是这个[subscriber sendNext:x]起的作用,因为我们如果把它注释掉,那么一启动就不会有打印了,以及我们在这个x本来传入的是textField,文本框里面是空,如果我们自己去创建一个textField,然后去设置text,比如我们修改成这样。

打印输出是


所以我猜测是这里把在conact方法中的map方法得到的那个textField这里就是始发地,而map方法中的block想要收到数据的话,那么就得让[self rac_signalForControlEvents]这个原信号肯定是去发送数据了的,其实我们看rac_signalForControlEvents这里面的方法实现其实主要的事情就是给textField添加一个target,去监听所有关于文本编辑的事件。

这里每次去调用的sendNext:方法传回来的x应该都是文本框因为外面的map方法得到的也是文本框.其实我们的map方法在其内部就是做了一个bind也就是信号的绑定的操作,在里面应该是对我们的[self rac_signalForControlEvents]这个原信号做了一次订阅的,所以它会去调用我们上面的block里面的方法,其实最后的发送数据出去给rac_textSignal是在这里

bind方法里面





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值