0

我一直在阅读 RACSequences 是“拉动驱动的”。有人可以向我解释如何根据需要从序列中“提取”值吗?

假设我有一个已变成信号的数组。然后说有另一个信号,当它发送一个值时,我想从数组序列中获取下一个值。我将如何做到这一点?这是我尝试过的,但它不起作用。

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订阅了信号并立即发送了数组中的值。但是,在样本信号发送之前,样本会阻止值传递给订阅者。我的理论是,当触发信号发送时,数组中的所有值都已发送。尽管情况似乎如此,但订阅者至少会获得发送的最后一个值@3。

4

1 回答 1

2

你应该能够做到这一点+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 之前等待来自两个信号的值。因此,在您的情况下,它将等待触发器触发,然后再发送下一对值。

于 2015-02-22T02:30:52.273 回答