美文网首页
RAC(Part1: 值的理解)

RAC(Part1: 值的理解)

作者: 快乐的小问酱 | 来源:发表于2014-11-29 18:37 被阅读185次

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描述的不是灯泡(可以被观察的对象),而是“时而是红色的,时而是蓝色的,可能被关掉,也可能忽然烧了”这个过程。

结论

  1. Sequence描述的是确定的序列,Signal描述的是将会发生的序列。
  2. Sequence有天然的结尾,而Signal的completed和errorr是其序列的结尾。
  3. 如果Sequence被放在一个黑盒子里,每隔1S随机取出一个值,取完所有的值就是completed,在取完之前有可能因error被取消这个过程,那么这个Sequence就被封装为一个Signal。
  4. 将Signal发送的所有的结果存储起来,那么我们可以将它看成一个Sequence。

相关文章

网友评论

      本文标题:RAC(Part1: 值的理解)

      本文链接:https://www.haomeiwen.com/subject/lwhgtttx.html