Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ReactiveCocoa zip未按预期工作_Objective C_Reactive Cocoa - Fatal编程技术网

Objective c ReactiveCocoa zip未按预期工作

Objective c ReactiveCocoa zip未按预期工作,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我想用ReactiveCocoa处理数据流,我想做的是,计算一段时间内数据流的平均值,然后用该值减去平均值。流字符将如下所示 Data source -> extract value ----> average---> zip \ / \------------/ 所以你可以把提取值信号生成平均信号,它也发送到zip和平均信号

我想用ReactiveCocoa处理数据流,我想做的是,计算一段时间内数据流的平均值,然后用该值减去平均值。流字符将如下所示

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