Objective c ReactiveCocoa zip未按预期工作
我想用ReactiveCocoa处理数据流,我想做的是,计算一段时间内数据流的平均值,然后用该值减去平均值。流字符将如下所示Objective c ReactiveCocoa zip未按预期工作,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我想用ReactiveCocoa处理数据流,我想做的是,计算一段时间内数据流的平均值,然后用该值减去平均值。流字符将如下所示 Data source -> extract value ----> average---> zip \ / \------------/ 所以你可以把提取值信号生成平均信号,它也发送到zip和平均信号
Data source -> extract value ----> average---> zip
\ /
\------------/
所以你可以把提取值信号生成平均信号,它也发送到zip和平均信号的结果结合起来
下面是要演示的代码
__block id<RACSubscriber> sourceSubscriber;
RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
sourceSubscriber = subscriber;
return nil;
}];
RACSignal *extractValueSignal = [sourceSignal map:^id(id value) {
NSLog(@"extractValueSignal %@", value);
return value;
}];
RACSignal *avgSignal = [extractValueSignal scanWithStart:[NSMutableArray array] reduce:^NSMutableArray *(NSMutableArray *array, id next) {
NSLog(@"avgSignal %@", next);
[array addObject:next];
if (array.count > 5) {
[array removeObjectsInRange:NSMakeRange(0, array.count - 5)];
}
return array;
}];
[[RACSignal zip:@[extractValueSignal, avgSignal] reduce:^id(NSNumber *value, NSNumber *avg) {
NSLog(@"zip %@, %@", value, avg);
return value;
}] subscribeNext:^(id x) {
NSLog(@"output %@", x);
}];
[sourceSubscriber sendNext:@1];
[sourceSubscriber sendNext:@2];
[sourceSubscriber sendNext:@3];
[sourceSubscriber sendNext:@4];
[sourceSubscriber sendNext:@5];
我这里的问题是zip块从未被调用,subscribeNext块也没有被调用。我想知道为什么它不起作用?我不应该让一个信号在流中出现两次吗?我应该用像tee或what这样的东西来提取值信号吗?好的,回答我自己的问题,我注意到,如果在createSignal块中添加一个NSLog
RACSignal *sourceSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"SUB %@", subscriber);
sourceSubscriber = subscriber;
return nil;
}];
然后你可以订阅
conn.signal
只要你愿意,它只会调用一次块
RACMulticastConnection *conn = extractValueSignal.publish;
[conn connect];
conn.signal