2017-11-16 1 views
1

Ich versuche, eine Sequenz von Zahlen mit einer Verzögerung zwischen jeder Emission zu emittieren. Ich habe eine NSIndexSet mit einer Reihe von Zahlen,Reaktive ObjC emittieren Sequenz mit Zeitintervall

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

Jetzt will ich jede Zahl mit einer Verzögerung emittieren, wie emittieren Nummer 2 wenige Sekunden nach dem Emittieren Nummer 1 und so weiter. Ich bin neu in Reactive ObjC. Wie kann ich das machen?

ich so etwas wie dies versuchen,

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

Grundsätzlich mag ich jedes Element aus einem Hintergrundthread emittieren, und der Abonnent verbraucht das Element in Main Thread.

Wie es in OBJ-C zu tun?

Antwort

0

Es gibt keinen eingebauten Operator, der das sofort macht, aber es ist nicht schwer, selbst zu konstruieren.

Sie können Ihre Sequenz in eine RACSignal über [sequence signal drehen. Sie können aber auch direkt dort einen Scheduler zur Verfügung stellen, wenn Sie wollen (wenn nicht, RAC einen neuen Scheduler für Sie erstellen)

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

Das Problem bei diesem Signal ist, dass sie alle Werte der Folge sofort emittiert. Vielleicht hast du die delay Operation schon selbst ausprobiert, aber das hilft nicht, da es alle Ereignisse um den gleichen Betrag verzögert, so dass sie verspätet ankommen, aber immer noch direkt hintereinander.

Die Grundidee, dies zu lösen, besteht darin, das Zahlensignal mit einem regelmäßigen Tick zu verknüpfen.

Hier ist, wie Sie ein Signal erzeugen kann, die Ereignisse in regelmäßigen Abständen

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

Um nun zu „paaren sie up“ Sie verwenden möchten die zip Operator sendet, denn das wartet, bis beide Signale ihre gesendeten erster Wert, bis ein Tupel mit beiden Werten als erster Wert gesendet wird und dann gewartet wird, bis beide ihren zweiten Wert gesendet haben und so weiter. Daher müssen die Zahlenwerte der Sequenz auf ihre Tick-Ereignisse warten.

[[[[RACSignal zip:@[tick, sequence]] map:^(RACTuple *tuple) { 
    return [tuple second]; 
}] deliverOn:[RACScheduler mainThreadScheduler]] 
subscribeNext:^(id _Nullable x) { 
    NSLog(@"Value: %@", x); 
}];