ReactiveCocoa - 如何从 RACSequence 一次获取一项?

ReactiveCocoa - How to get one item at a time from RACSequence?

我一直在读到 RACSequences 是 "pull-driven"。有人可以向我解释如何按需 "pull" 不按顺序排列值吗?

假设我有一个数组,我已经把它变成了一个信号。然后说还有另一个信号,当在其上发送一个值时,我想从数组序列中获取下一个值。我将如何做到这一点?这是我试过的方法,但没有用。

RACSignal *arraySig = [@[@1, @2, @3].rac_sequence signal];
RACSubject *triggerSig = [RACSubject subject];

[[[arraySig doNext:^(id x) {
        DDLogVerbose(@"DoNext got %@ from array", x);
    }]
    sample:triggerSig]
    subscribeNext:^(id x) {
        DDLogVerbose(@"Subscriber got %@ from array", x);
    }];

[triggerSig sendNext:@"Give me data!"];

// I expect to see "Got 1 from array" printed out

编辑: 我更新了上面的示例,以便在示例之前有一个下一步,最后有一个订阅者。

这是我得到的输出:

DoNext got 1 from array
DoNext got 2 from array
DoNext got 3 from array

没有值传递给订阅者。我认为 sample 不是我想要的。在我看来,sample 订阅了信号并立即发送了数组中的值。但是,sample 会阻止值传递给订阅者,直到发送 sample 信号。我的理论是,当触发信号发送时,数组中的所有值都已发送。虽然看起来如果是这种情况,订阅者至少会得到发送的最后一个值,@3。

您应该可以通过 +zip:reduce:

完成此操作
RACSignal *arraySig = [@[@1, @2, @3].rac_sequence signal];
RACSubject *triggerSig = [RACSubject subject];

[[RACSignal zip:@[arraySig, triggerSig] reduce:^id(id arrayVal, id triggerVal) {
    return arrayVal;
}] subscribeNext:^(id x) {
    DDLogVerbose(@"Subscriber got %@ from array", x);
}];

[triggerSig sendNext:@"Give me data!"];

zip 操作等待来自两个信号的值,然后再将它们传递给 reduce。因此,在您的情况下,它将等待触发器触发,然后再发送下一对值。