如何在ReactiveCocoa中的信号序列之间创建延迟?

Han*_*son 3 cocoa reactive-cocoa

我有三个信号,我想按顺序评估,它们之间有一秒钟的延迟.

这个片段做我想要的,但它很难看:

RACSignal *first = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    NSLog(@"First!");
    [subscriber sendCompleted];
    return nil;
}];

RACSignal *second = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    NSLog(@"Second!");
    [subscriber sendCompleted];
    return nil;
}];

RACSignal *third = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    NSLog(@"Third!");
    [subscriber sendCompleted];
    return nil;
}];

NSArray *signals = @[first, [[RACSignal empty] delay:1.0f],
                     second, [[RACSignal empty] delay:1.0f],
                     third];

NSLog(@"Starting");
[[[signals rac_sequence].signal concat] subscribeCompleted:^{
    NSLog(@"Done!");
}];
Run Code Online (Sandbox Code Playgroud)

它打印出来:

2013-11-18 17:13:35.326 Starting
2013-11-18 17:13:35.327 First!
2013-11-18 17:13:36.328 Second!
2013-11-18 17:13:37.329 Third!
2013-11-18 17:13:37.330 Done!
Run Code Online (Sandbox Code Playgroud)

eri*_*ice 7

你的代码非常接近.您不需要"spacer"信号,只需将-delay:呼叫置于第一和第二信号上即可.-concat:将序列化信号的执行,使得每个后续信号仅在其先前信号完成之后才开始,并且-delay:将推迟其信号完成的传递,从而在后续信号开始工作之前提供所需的延迟.您也不需要跳入RACSequence并退出,因为-concat:可以快速枚举信号:

NSLog(@"Starting");
NSArray *signals = @[ [first delay:1.0f], [second delay:1.0f], third ];
[[RACSignal concat:signals] subscribeCompleted:^{
    NSLog(@"Done!");
}];
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这并没有真正解决它.你看,延迟只会延迟下一个和完整的事件.原始信号的执行块仍然被执行.因此,如果我将延迟时间调整为十秒,这就是日志输出:`2013-11-19 09:08:25.748开始2013-11-19 09:08:25.749首先!2013-11-19 09:08:25.749第二!2013-11-19 09:08:35.750第三!2013-11-19 09:08:45.752完成!"你看到第一个!第二个!同时打印.然后有十秒钟的延迟,直到第二个信号的完成事件通过延迟. (2认同)
  • 我明白你在说什么.我没有意识到你想延迟*工作*,而不是事件.那么,将延迟放在第一和第二信号上就足够了吗?这将延迟第一个信号的完成事件的传递,这可能不是您想要的,但这最终会延迟第二个信号从开始到指定的时间间隔之后. (2认同)