RAC中rac_textSignal合并出现的问题

我们用过RAC中的combineLatest应该都知道,如果我们组合了两个信号,那么必须要两个信号都有数据的发送的时候才会去触发,三个信号就是三个以此类推,但是有个现象奇怪的就是,当我们给三个文本框的rac_textSignal给合并在一起,只要一个文本框改变就会去触发这是为什么?比如说下面的这样的代码

    RACSignal * signal1 = [_textField1 rac_textSignal];
    RACSignal * signal2 = [_textField2 rac_textSignal];
    RACSignal * signal3 = [_textField3 rac_textSignal];

    [[RACSignal combineLatest:@[signal1,signal2,signal3]]subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"%@",x.first);
    }];

一运行就会打印,为什么会一运行就打印在我的另一篇文章中讲过 http://blog.csdn.net/zcmuczx/article/details/78967683


修改一个也会去打印

下面就进入combineLatest方法去看看,其实就是调用了下面的方法


我们再去看join方法,其中有我自己的测试打印的代码,这里就稍微的做个浅析,其中for循环里面其实就是去进行数据的一些合并处理,以及block(current,stream)其实也就是去执行的就是我们外面的这行代码[left combineLatestWith:right]。

在- (RACSignal *)combineLatestWith:(RACSignal *)signal这个方法中做的其实就是进行数据的判断,判断是否都有数据了,如果都有数据的再一起进行RACTuplePack(lastSelfValue, lastOtherValue)然后发送出去。

RACDisposable *selfDisposable = [self subscribeNext:^(id x) {
            @synchronized (disposable) {
                
                lastSelfValue = x ?: RACTupleNil.tupleNil;
                
                sendNext();
            }
        } error:^(NSError *error) {
            [subscriber sendError:error];
        } completed:^{
            @synchronized (disposable) {
                selfCompleted = YES;
                if (otherCompleted) [subscriber sendCompleted];
            }
        }];
需要注意的是这里的x是已经在 join方法中被改过了,这里为什么要介绍这个?因为当第一次current为空的时候为rac_textSignal把本来回返回的x的内容包装成元组之后返回了一个新的信号,那样之后再上面的订阅到的x也就变了不再是文本框里面的文字了而是包装成元组了。

if (current == nil) {
current = [stream map:^(id x) {
        
return RACTuplePack(x);
}];

continue;
}
 current = block(current, stream);
}
下面的return 的map方法中也就去对结果进行解包,转换成数组

return [current map:^(RACTuple *xs) {
	
		NSMutableArray *values = [[NSMutableArray alloc] init];
        
		while (xs != nil) {
			[values insertObject:xs.last ?: RACTupleNil.tupleNil atIndex:0];
			xs = (xs.count > 1 ? xs.first : nil);
		}
		return [RACTuple tupleWithObjectsFromArray:values];
	}];
通过下面我们发现其实判断每一个信号的数据有没有到来就是根据数据空不空来判断的,然后我们通过第一次打印的时候其实文本框的数据不为nil,而是为""所以就认为是三个信号都来了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值