使用ReactiveCocoa将信号值收集到数组中

时间:2015-07-26 16:05:15

标签: objective-c reactive-cocoa

我使用ReactiveCocoa记录数组中的点击:

@interface ViewController : UIViewController
@property (strong, nonatomic) NSArray *first10Taps;
@property (strong, nonatomic) UITapGestureRecognizer *tapGesture;
@end

@implementation ViewController
- (void) viewDidLoad
{
  [super viewDidLoad];

  RACSignal *tapSignal = [[self.tapGesture rac_gestureSignal] map:^id(UITapGestureRecognizer *sender) {
    return [NSValue valueWithCGPoint:[sender locationInView:sender.view]];
  }];

  // This signal will send the first 10 tapping positions and then send completed signal.
  RACSignal *first10TapSignal = [tapSignal take:10];

  // Need to turn this signal to a sequence with the first 10 taps.
  RAC(self, first10Taps) = [first10TapSignal ...];
}
@end

如何将此信号转换为阵列信号?

每次发送新值时我都需要更新数组。

2 个答案:

答案 0 :(得分:4)

RACSignal上有一个名为collect的方法。它的文件说:

  

将所有接收者的next收集到NSArray中。零值将是   转换为NSNull。这对应于Rx中的ToArray方法。   返回一个信号,当接收器发送单个NSArray时   成功完成。

所以你可以简单地使用:

RAC(self, first10Taps) = [first10TapSignal collect];

答案 1 :(得分:2)

感谢MichałCiuba的回答。使用-collect只会在上游信号完成时发送收集值。

我找到了使用-scanWithStart:reduce:生成信号的方式,每次发送next值时都会发送该信号。

RAC(self, first10Taps) = [firstTapSetSignal scanWithStart:[NSMutableArray array]  reduce:^id(NSMutableArray *collectedValues, id next) {
  [collectedValues addObject:(next ?: NSNull.null)];
  return collectedValues;
}];