Objective c 在特定信号发生之前缓冲信号

Objective c 在特定信号发生之前缓冲信号,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我想知道是否有可能在某个特定信号的nexts之间累积信号的结果。近似 [[[RACSignal combineLatest:@[signal1, signal2, signal3]] takeUntil:signal4] subscribeNext:^(id x) { // ... }]; 但在第一个信号4的下一个后未完成 我正在使用的场景是,我有一个显示viewController2的viewController1viewController2

我想知道是否有可能在某个特定信号的
next
s之间累积信号的结果。近似

[[[RACSignal
    combineLatest:@[signal1, signal2, signal3]]
    takeUntil:signal4]
    subscribeNext:^(id x) {
        // ...
    }];
但在第一个
信号4
下一个
后未完成

我正在使用的场景是,我有一个显示
viewController2
viewController1
viewController2
允许用户更改影响
viewController1
中显示的数据的
对象。目前,我正在
viewController2
上公开一个
objectChangedSignal
,并从
viewController1
收听它

但是,我希望直接从
viewController1
接收
对象的更改,但只有在它触发
视图后才会出现
信号,并且只有在
视图之后发生的更改才会消失


希望有意义,谢谢。

缓冲值的一种方法是使用
-[RACSignal collect]
,它将值收集到一个数组中,直到信号完成:

[[[RACSignal combineLatest:@[ s1, s2, s3 ]]
    collect]
    takeUntil:s4]
然而,您可能希望在最终信号上单独发送每个值,而不是一个值数组。您可以使用
-[RACSignal flattmap:
将这些值展平回最终信号:

[[[[RACSignal combineLatest:@[ s1, s2, s3 ]]
    collect]
    takeUntil:s4]
    flattenMap:^(NSArray *collected) {

        return [[collected rac_sequence] signal];

    }]
由于您不希望信号在
s4
之后完成,因此每次
s4
发送值后,您都可以使用
-repeat
重新订阅。如果未执行此操作,则发生此情况时,
-takeUntil:
将导致信号完成

[[[[[RACSignal combineLatest:@[ s1, s2, s3 ]]
    collect]
    takeUntil:s4]
    flattenMap:^(NSArray *collected) {

        return [[collected rac_sequence] signal];

    }]
    repeat]
请注意,如果任何组合信号为冷信号,则再吸收将导致其副作用发生更多次。因此,您可能必须通过多播将它们(或组合信号)转换为热信号:

如果您的信号可能无限长,您可能需要明确取消订阅(通过处理
d


(不必客气,此代码未经测试。)

感谢您的详细回答!但它并没有以我想象的方式真正起作用;很可能是由于任务描述不当:
s1
s2
s3
不一定会触发。但是如果他们这样做了,我只想在
s4
触发后得到通知。如果
s1
s2
s3
中的任何一个都不发送值,那么
-combinelateTest:
将永远不会发送值–它将等待发送给它的每个信号发送一个值,然后再发送值元组。(有一些处理方法,例如使用
-startWith:
)它听起来也像
-[takeUntil:s4]
不是您想要的,因为这在
s4
点火时完成了信号。也许您需要
-skipUntilBlock:
-skiphilblock:
-if:then:else:
操作之一?
RACMulticastConnection *mc = [[RACSignal combineLatest:@[ s1, s2, s3 ]] publish];
RACDisposable *d = [mc connect];
[[[mc.signal
    takeUntil:s4]
    flattenMap:^(NSArray *collected) {

        return [[collected rac_sequence] signal];

    }]
    repeat]