5

ReactiveCooco kann das Signal in ein "heißes" Signal umwandeln, indem es -subscribeCompleted: aufruft. Aber ich denke, dass diese Methode ziemlich ausführlich ist, wenn Sie sich nicht für das Ergebnis interessieren (d. H. Keine Abonnenten).Wie kann RACSignal heiß werden?

RACDisposable *animationDisposable = [[self play:animation] subscribeCompleted:^{ 
    // just to make the animation play 
}]; 

Und diese 3 Zeilen sind nicht ausdrucksvoll genug, um meine Absicht zu zeigen.

Gibt es eine Methode für ähnliche Zwecke? Vielen Dank!

+0

Es hängt wirklich davon ab, wie Sie es am Ende verwenden möchten. Interessierst du dich für die Ergebnisse? – joshaber

+0

Ich möchte nichts machen, außer es heiß zu machen (= mache es einmal laufen). Ich möchte etwas ausdrucksvolleres. Die obige Implementierung ist unklar. Der neue Programmierer könnte denken, dass er falsch aufgerufen wurde und löscht ihn. – HKTonyLee

Antwort

5

Ich möchte nichts machen, außer es heiß zu machen (= es einmal laufen lassen).

"You keep using that word. I do not think it means what you think it means."

A "hot-Signal" ist ein Signal, das Werte (und vermutlich funktioniert), unabhängig davon, ob es irgendwelche Teilnehmer sendet. Ein "kaltes Signal" ist ein Signal, das seine Arbeit und das Senden von irgendwelchen Werten verzögert, bis es einen Teilnehmer hat. Und ein kaltes Signal führt seine Arbeit aus und sendet Werte für jeweils Abonnenten.

Wenn Sie ein kaltes Signal nur einmal ausführen möchten, aber mehrere Teilnehmer haben, müssen Sie Multicast das Signal. Multicasting ist ein ziemlich einfaches Konzept, das wie folgt funktioniert:

  1. Erstellen Sie ein RACSubject, um die Werte zu signieren, die von dem Signal gesendet werden, das Sie einmal ausführen möchten.
  2. Abonnieren Sie das Thema so oft wie nötig.
  3. Erstellen Sie eine einzelne Subskription für das Signal, das Sie nur einmal ausführen möchten, und senden Sie es für jeden vom Signal gesendeten Wert an das Subjekt mit [subject sendNext:value].

Sie können jedoch und sollten RACMulticastConnection verwenden, um alle der oben mit weniger Code zu tun:

RACMulticastConnection *connection = [signal publish]; 
[connection.signal subscribe:subscriberA]; 
[connection.signal subscribe:subscriberB]; 
[connection.signal subscribe:subscriberC]; 
[connection connect]; // This will cause the original signal to execute once. 
         // But each of subscriberA, subscriberB, and subscriberC 
         // will be sent the values from `signal`. 
+0

Vielen Dank. Aber das ist nicht was ich will. Ich möchte ein Signal abgeben, dass mir das Ergebnis egal ist (dh kein Teilnehmer). Es ist schwierig, in einer reinen funktionalen Umgebung zu arbeiten, aber es geschieht in einer Stateful-Umgebung. Es ist analog zum 'nil' Delegierten. Wenn ich keinen Rückruf benötige, kann ich die delegate -Eigenschaft ignorieren, anstatt den gesamten Delegaten durch die Implementierung von tonnenweise leeren Funktionen anzupassen. Es ist weniger ausdrucksstark. – HKTonyLee

+0

Ich weiß nicht, ob meine Frage nützlich ist: -/Ich denke, einige Novizen (include mich, LOL) werden auch ähnliche Fragen stellen. – HKTonyLee

+0

Der Punkt von ReactiveCocoa ist es, Sie elegant mit den * Ergebnissen * der Arbeit umgehen zu lassen.Wenn alles, was Sie wollen, ist, dass etwas Arbeit als Nebeneffekt passiert und Sie sich nicht um die Ergebnisse kümmern, dann macht ReactiveCocoa nicht wirklich viel für Sie. – erikprice

4

Wenn Sie nicht über den Ausgang des Signals (und aus irgendeinem Grunde ist es egal Sie wirklich wollen spielen, um ein Signal zu sein), möchten Sie vielleicht einen Befehl machen. Ein Befehl bewirkt, dass ein Signal über eine Art von Ereignis (wie z. B. ein Drücken einer Taste oder ein anderes Ereignis) ausgeführt wird. Erstellen Sie einfach das Signal, fügen Sie es einem Befehl hinzu und führen Sie es dann aus, wenn Sie es ausführen müssen.

@weakify(self); 
RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^(id input) { 
    @strongify(self); 
    return [self play:animation]; 
}]; 

//This causes the signal to be ran 
[command execute:nil]; 

//Or you could assign the command to a button so it is executed 
// when the button is pressed 
playButton.rac_command = command; 
+0

Danke! Ich denke, ich hatte ein falsches Konzept über reaktive Programmierung. Ich finde es immer noch heraus ;-) – HKTonyLee

+0

!!!! Dieser Thread hat wesentlich besser erklärt, was ein RACCommand ist als jede reaktive Kakao-Dokumentation. Vielen Dank! – fatuhoku

Verwandte Themen