反应性ObjC以时间间隔发射序列

时间:2017-11-16 18:01:50

标签: ios objective-c reactive-cocoa racsignal racsequence

我试图发射一系列数字,每次发射之间有延迟。我有一个带有一系列数字的NSIndexSet,

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

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

我正在尝试这样的事情,

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

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

如何在OBJ-C中完成?

1 个答案:

答案 0 :(得分:0)

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

您可以通过RACSignal将序列转换为[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);
}];