个人RAC部分方法记录

RACSignal (RACStream)

  • concat:
[[signalA concat:signalB] subscribeNext:^(id x) {
        NSLog(@"%@",x);
}];

当signalA completed之后 signalB才能执行。

  • zipWith:
[[signalA zipWith:signalB] subscribeNext:^(RACTuple* x) {
        RACTupleUnpack(NSString *stringA, NSString *stringB) = x;
        NSLog(@"我们是%@%@的", stringA, stringB);
}];

当且仅当signalA和signalB同时都产生了值的时候,一个value才被输出,signalA和signalB只有其中一个有值时会挂起等待另一个的值,所以输出都是一对值(RACTuple)),当signalA和signalB只要一个先completed,RACStream也解散。

  • distinctUntilChanged
    一个相当常用的Filter(但它不是- filter:的衍生方法)
    它将这一次的值与上一次做比较,当相同时(也包括- isEqual:)被忽略掉。

  • ignore: (id)
    忽略给定的值,注意,这里忽略的既可以是地址相同的对象,也可以是- isEqual:结果相同的值。

  • take: (NSUInteger)
    从开始一共取N次的next值,不包括Competion和Error

[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { 
    [subscriber sendNext:@"1"]; 
    [subscriber sendNext:@"2"]; 
    [subscriber sendNext:@"3"]; 
    [subscriber sendCompleted]; 
    return nil; 
}] take:2] subscribeNext:^(id x) { 
    NSLog(@"only 1 and 2 will be print: %@", x); 
}]; 
  • takeUntil: (RACSignal *)
    当给定的signal完成前一直取值,也就是说signal completed之后,就停止取值。
    同理 skip:(NSUInteger) and -skipUntil:(RACSignal *)

  • materialize:
    materialize会将一个signal转换为RACEvent信号(将一个signal的next:complete和error:消息转换为RACEvent实例的next:的值)

RACSignal (Operations)

  • throttle:
    它接收一个时间间隔interval作为参数,如果Signal发出的next事件之后interval时间内不再发出next事件,那么它返回的Signal会将这个next事件发出。也就是说,这个方法会将发送比较频繁的next事件舍弃,只保留一段“静默”时间之前的那个next事件,这个方法常用于处理输入框等信号(用户打字很快),因为它只保留用户最后输入的文字并返回一个新的Signal,将最后的文字作为next事件参数发出。

  • merge:(id)signals
    返回signals当中的最新的next

[[RACSignal merge:@[signalA, signalB]] subscribeNext:^(id x) {
    NSLog(@"处理%@",x);
}];
  • (RACSignal *)combineLatestWith:(RACSignal *)signal;
    返回RACTuples类型的signal
  • (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals;
    返回a signal
  • (RACSignal *)then:(RACSignal * (^)(void))block;
    忽略接下来收到的信号值,直接在信号complete之后执行block
+ (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler;

    [[RACSignal interval:1.0f onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
        // 这就是间隔1秒在主线程执行一次的signal
    }];

方法返回一个在X线程(这个看你选择)上间隔X(interval参数)秒执行一次的signal,内部是利用GCD方法实现。

  • (RACSignal *)catchTo:(RACSignal *)signal;
    当发生errors的时候订阅signal

RACTuple

   RACTupleUnpack(NSString *string, NSNumber *num) = [RACTuple tupleWithObjects:@"foo", @5, nil];
   NSLog(@"string: %@", string);
   NSLog(@"num: %@", num);

   /* The above is equivalent to: */
   RACTuple *t = [RACTuple tupleWithObjects:@"foo", @5, nil];
   NSString *string = t[0];
   NSNumber *num = t[1];
   NSLog(@"string: %@", string);
   NSLog(@"num: %@", num);

推荐阅读更多精彩内容