3

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

这个片段做了我想要的,但它很丑:

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!");
}];

它打印出来:

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!
4

2 回答 2

7

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

NSLog(@"Starting");
NSArray *signals = @[ [first delay:1.0f], [second delay:1.0f], third ];
[[RACSignal concat:signals] subscribeCompleted:^{
    NSLog(@"Done!");
}];
于 2013-11-19T03:05:50.673 回答
2

为此,我为 Swift 创建了一个类别:

extension RACSignal {
    func execute() -> RACDisposable {
        return self.subscribeCompleted { () -> Void in

        }
    }

    func executeWithDelay(interval:NSTimeInterval) -> RACDisposable {
        var signals = [RACSignal.empty().delay(interval), self]
        var delayedSignal = RACSignal.concat(signals)
        return delayedSignal.execute()
    }
}

是什么使得可以通过以下方式延迟执行单个信号:

signal.executeWithDelay(2.0) 

要从信号中获取响应,您可以使用 do 方法(doNext、doError、doCompleted 等)订阅

于 2015-04-03T14:40:21.287 回答