系列文章
RACSignal,RACSubject,RACReplaySubject
RAC bind
RAC Merge flatten
RACMulticastConnection
RAC switchToLatest
前面对bind、flattenMap已经有了一定的了解,而flatten内部其实是对flattenMap的封装,但是单看flatten,很难理解他的意义,需要结合Merge来看。
- (__kindof RACStream *)flatten {
return [[self flattenMap:^(id value) {
return value;
}] setNameWithFormat:@"[%@] -flatten", self.name];
}
+ (RACSignal *)merge:(id<NSFastEnumeration>)signals {
NSMutableArray *copiedSignals = [[NSMutableArray alloc] init];
for (RACSignal *signal in signals) {
[copiedSignals addObject:signal];
}
return [[[RACSignal
createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
for (RACSignal *signal in copiedSignals) {
[subscriber sendNext:signal];
}
[subscriber sendCompleted];
return nil;
}]
flatten]
setNameWithFormat:@"+merge: %@", copiedSignals];
}
通过之前的bind
方法的分析,知道其实中间加了两层转发(bind生成一个新信号,接收到信号好,过滤生成一个新的信号,新的信号才转发到原信号),将原信号的消息转发到bind生成的信号中去
- 在
bind
中,我们默认使用了RACReturnSignal
包装了原信号发送的消息 - 而在
merge
中,我们创建了一个新的信号,然后调用flatten
. 然后生成第二个信号返回出去 -
flatten
内部其实是bind
,所以会立马订阅merge
创建的信号,这是会将merge
合并的多个信号作为消息发送给订阅者。 - 这时
bind
内部,对原信号的订阅者就会收到消息,而消息正是用来合并的两个子信号。而子信号通过flatten
中的方法直接返回自己,所以这里就不在是RACReturnSignal
信号了,而是要合并的两个信号。 - 然后对着两个信号进行订阅。当收到消息是,在把消息发送给bind产生的信号中。
普通bind流程 merge/flatten这里有几个注意点。
这个过程中产生了很多信号。1,要合并的两个信号、2,merge
中先创建一个新的信号作为原信号来进行调用bind,用来将合并的两个信号作为消息发送到bind内部 、3,flatten
也就是bind
生成了一个信号,而这个信号才是merge
中返回的信号,才是用来订阅获取消息的信号。
普通bind
中,原信号消息发送到bind内部,bind内部过滤后生成新的信号,新的信号将消息发送到bind生成的信号中(RACReturnSignal
类型相当于直接转发了信号)
merge/flatten
中,将两个信号合并生成一个新的信号作为原信号,此信号进行bind,并且将要合并的两个信号发送到bind
内部,因为flatten
中的实现是直接返回信号本身,所以这里并没有生成新的信号,而且获取到了外部要合并的两个信号,并且订阅了两个信号,将消息转发到bind
生成的信号中。
网友评论