我一直在阅读RACSequence是“拉动式”的。有人可以向我解释如何按需从序列中“抽取”价值吗?
说我有一个数组,我已经将其转换为信号。然后说还有另一个信号,当在其上发送一个值时,我想从数组序列中获取下一个值。我将如何实现?这是我尝试过的方法,但是不起作用。
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。
您应该能够做到这一点 +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!"];
压缩操作在将两个信号传递给reduce之前都等待来自两个信号的值。因此,在您的情况下,它将在发送下一对值之前等待触发器触发。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句