1

我正在尝试发出一系列数字,每次发射之间都有延迟。我有一个带有一系列数字的 NSIndexSet,

[[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 100)]

现在我想延迟发射每个数字,比如在发射数字 1 后几秒钟发射数字 2,依此类推。我是 Reactive ObjC 的新手。我怎样才能做到这一点?

我正在尝试这样的事情,

[[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, runescapePackages.count-1)].rac_sequence ...

基本上我想从后台线程发出每个项目,并且订阅者在主线程中使用该项目。

如何在 OBJ-C 中做到这一点?

4

1 回答 1

0

没有内置的运算符可以立即执行此操作,但自己构建并不难。

您可以将您的序列变成RACSignalvia [sequence signal。此外,如果需要,您可以在此处提供调度程序(如果没有,RAC 将为您创建一个新的调度程序)

RACScheduler *backgroundScheduler = [RACScheduler scheduler];
RACSignal *sequence = [[[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 50)]
                                    rac_sequence]
                                   signalWithScheduler:backgroundScheduler];

这个信号的问题在于,它会立即发出序列的所有值。也许您delay自己已经尝试过该操作,但这无济于事,因为它会将所有事件延迟相同的数量,因此它们会延迟到达,但仍然紧随其后。

解决这个问题的基本思路是将数字信号与常规刻度配对。

以下是如何创建定期发出事件的信号的方法

RACSignal *tick = [RACSignal interval:0.5 onScheduler:backgroundScheduler];

现在为了“配对”你想使用zip运算符,因为它会等到两个信号都发送了它们的第一个值,直到它发送一个将两个值作为第一个值的元组,然后等到两个信号都发送了它们的第二个值等等上。因此,序列的数值必须等待它们的滴答事件

[[[[RACSignal zip:@[tick, sequence]] map:^(RACTuple *tuple) {
    return [tuple second];
}] deliverOn:[RACScheduler mainThreadScheduler]]
 subscribeNext:^(id  _Nullable x) {
    NSLog(@"Value: %@", x);
}];
于 2017-11-17T11:02:33.510 回答