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]