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。因此,在您的情况下,它将等待触发器触发,然后再发送下一对值。
我一直在读到 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。因此,在您的情况下,它将等待触发器触发,然后再发送下一对值。