我使用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
如何将此信号转换为阵列信号?
每次发送新值时我都需要更新数组。
答案 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;
}];