Stream
和函数语言的世界一样,在RAC的世界中没有变量。重复一遍,没有变量。那么值在那里?
一切值都是流,无论你是否可以马上获得这个值,你不能在获得第一个值之前获得第二个值。
Sequence
你可以从羽毛球筒中马上倒出一个球,但是假设我们发明一种羽毛球筒,在你倒的时候,才从中生产一个新的羽毛球(惰性�求值)。这种新的羽毛球筒,有别于普通的羽毛球筒(在其他语言中的array),就是sequence,它是pull-driven的。
NSArray *strings = @[@"A", @"B", @"C"];
RACSequence *sequence = [strings.rac_sequence map:^(NSString *str) {
NSLog(@"%@", str); //惰性求值的,只有在取值的时候才会调用这里
return [str stringByAppendingString:@"_"];
}];
NSString *concatA = sequence.head;
NSLog(@"%@", concatA);
Signal
在subscribe之后,你可以获得这个值。它是push-driven的。
RACSignal *logginSignal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
[subscriber sendNext:@(3)];
[subscriber sendCompleted];
return nil;
}];
[logginSignal subscribeNext:^(id number) {
NSLog(@"number: %@", number);
}];
上面的示例发送了一个值给订阅者,然后发送了完成事件,等价于:
RACSignal *anotherLogginSignal = [RACSignal return:@(3)];
[anotherLogginSignal subscribeNext:^(id number) {
NSLog(@"another number: %@", number);
}];
很容易将RACSignal和观察者模式联系起来,但是RACSignal不是Observable。假如有一个灯泡,时而是红色的,时而是蓝色的,可能被关掉,也可能忽然烧了。那么RACSignal描述的不是灯泡(可以被观察的对象),而是“时而是红色的,时而是蓝色的,可能被关掉,也可能忽然烧了”这个过程。
结论
- Sequence描述的是确定的序列,Signal描述的是将会发生的序列。
- Sequence有天然的结尾,而Signal的completed和errorr是其序列的结尾。
- 如果Sequence被放在一个黑盒子里,每隔1S随机取出一个值,取完所有的值就是completed,在取完之前有可能因error被取消这个过程,那么这个Sequence就被封装为一个Signal。
- 将Signal发送的所有的结果存储起来,那么我们可以将它看成一个Sequence。