programming in RxSwift and RxCocoa

In diesem speziellen Artikel werden wir versuchen, Fragen wie diese zu beantworten: Was ist reaktive Programmierung? Was ist funktionale reaktive Programmierung? Welche Vorteile können wir durch die Verwendung von Rx in unseren Anwendungen erzielen und wo können Sie anfangen, Rx in Ihre Anwendung zu integrieren?

Was ist reaktive Programmierung?

Wahrscheinlich finden Sie in jedem Artikel über reaktive Programmierung Verweise und Links zum “Reactive Manifesto”. In diesem Dokument finden Sie die wichtigsten Aussagen über die Vorteile reaktiver Anwendungen, aber es gibt Ihnen keine Hinweise darauf, wie man diese erreicht.

Tatsächlich ist das Reactive Manifesto nur eine Liste der wichtigsten Säulen, auf die Ihre reaktive Anwendung achten muss. Insbesondere: Reaktionsfähig, Belastbar, Elastisch und Nachrichtengetrieben.

Wenn wir versuchen, die ganze Idee in einem Satz auszudrücken, erhalten wir etwas wie:
Reaktive Programmierung gibt uns die Möglichkeit, hoch stabile und reaktionsfähige Anwendungen zu erstellen, die leicht modifiziert oder erweitert werden können, gemäß dem nachrichtengetriebenen Ansatz. Um diese Vorteile in Ihre Anwendung zu integrieren, können Sie die reaktive Programmierung verwenden. Also, was ist das, reaktive Programmierung?

Reaktive Programmierung ist ein Ansatz, der auf den Prinzipien asynchroner Datenströme und unveränderlicher Daten basiert. Er baut auf grundlegenden Konzepten wie Observables, Observers und Schedulers auf. Die ersten beiden sind eine Art Realisierung des altbewährten Observer-Musters. Und Schedulers helfen bei der asynchronen Programmierung und der Verwaltung von Threads.

Zum Beispiel, wenn Sie einen YouTube-Kanal abonnieren, erhalten Sie Benachrichtigungen über neue Videos oder Streams und können diese überprüfen, wenn Sie möchten. Dasselbe gilt für Ihr Projekt, Sie können ein Ereignis abonnieren und entsprechend der Logik Ihrer App darauf reagieren. Schedulers kommen ins Spiel, wenn Sie beispielsweise ein Ereignis im Hintergrund-Thread auslösen und darauf im Haupt-Thread reagieren müssen.

Funktionale Reaktive Programmierung

Fast alle modernen Rx-Bibliotheken verwenden grundlegende Prinzipien der funktionalen Programmierung. Wie Sie vielleicht wissen, manipulieren Sie in der funktionalen Programmierung Funktionen auf die gleiche Weise wie andere Datentypen wie Integer oder Strings, und all diese Werte sind unveränderlich.

In der funktionalen Programmierung arbeiten Sie immer mit unveränderlichen Datenstücken, was es Ihnen ermöglicht, sich nicht um Nebenläufigkeit und aktuelle Datenzustände zu kümmern. Dies bietet Ihnen große Vorteile bei der Verwendung einer asynchronen Multi-Thread-Architektur. Außerdem ist es dank der Vorhersehbarkeit des Verhaltens in der funktionalen Programmierung viel einfacher, Ihre gesamte Logik mit Unit-Tests abzudecken. Dies kann Ihnen potenziell ein stabileres Produkt liefern.

FRP nutzt das Beste aus reaktiver und funktionaler Programmierung. In der traditionellen Programmierung verwenden wir auch Ereignisströme, um Benutzeraktivitäten zu empfangen, wie das Drücken einer Taste, das Ändern der Geräteausrichtung und andere. In FRP können Variablen, Benutzereingaben, Antworten vom Server, Parameter von Modellen und Modelle selbst als Stream dargestellt werden. Dies erhöht das Abstraktionsniveau, sodass Sie die Streams anstelle von Objekten oder Funktionen manipulieren können.

Der Hauptbestandteil von FRP ist Observable, das eine breite Palette von Operatoren hat, mit denen Sie tatsächlich Ihre Geschäftslogik der Anwendung implementieren. Die Hauptkategorien solcher Operatoren sind: Observables transformieren, Observables filtern, Observables kombinieren und andere. Die vollständige Liste und Beschreibungen dazu finden Sie hier.

Es mag ziemlich schwer verständlich erscheinen. Zum Glück können wir zur besseren Verständlichkeit der Logik der reaktiven Programmierung Marmor-Diagramme wie dieses verwenden:

Solche Diagramme für verschiedene Operatoren, die ihre Funktionsweise veranschaulichen, finden Sie hier.

Funktionale Reaktive Programmierung mit Swift

Wie erreichen Sie diese Ergebnisse für Ihre Anwendung? Um Rx in Ihr spezielles Projekt zu integrieren, können Sie eine der Rx-Bibliotheken verwenden, deren Liste Sie hier finden können.

Zum Beispiel verwenden wir RxSwift und probieren einige grundlegende Operatoren aus.

Beginnen wir mit dem “filter”-Operator.
“Der Filter-Operator filtert ein Observable, indem er nur Elemente zulässt, die einen Test bestehen, den Sie in Form einer Prädikatsfunktion angeben.”

Wie Sie in diesem Beispiel sehen können, haben wir ein Observable vordefinierter Ganzzahlen erstellt. Dann haben wir die geraden Werte gefiltert und uns auf dieses Observable abonniert. Das Kombinieren von Operatoren ist sehr flexibel und ermöglicht es Ihnen, wirklich leistungsstarke Ausdrücke zu erstellen.

Ein weiteres Beispiel ist dieses Code-Snippet mit dem “flatMap”-Operator.

“Der FlatMap-Operator transformiert ein Observable, indem er eine Funktion anwendet, die Sie für jedes Element angeben, das vom Quell-Observable emittiert wird, wobei diese Funktion ein Observable zurückgibt, das selbst Elemente emittiert. FlatMap verbindet dann die Emissionen dieser resultierenden Observables und gibt diese verbundenen Ergebnisse als eigene Sequenz aus.”

In diesem Beispiel haben wir zunächst die Struktur “Video” mit nur einem Observable-Parameter “subscribers” erstellt. Eine Möglichkeit, Ereignisse von diesen Observables zu empfangen, besteht darin, sich auf jedes einzelne zu abonnieren, aber dank “flatMap” können wir ein ähnliches Ergebnis auf elegantere Weise erzielen. Im Grunde erstellen wir ein neues PublicSubject “channel” und verwenden den “flatMap”-Operator, um einen Stream mit all diesen Observables zu erhalten. Dann abonnieren wir uns auf sie, um die Werte auf dem Bildschirm anzuzeigen. Wie bereits erwähnt, können wir Operatoren kombinieren, um komplexere Funktionalitäten zu erhalten. In diesem Fall verwenden wir “filter” vor “flatMap”, um nur Videos mit einem subscriber’s.value höher als zwanzig zu beobachten. Dadurch wird die Änderung des “dog”-Videos nicht ausgelöst, bis wir uns direkt darauf abonnieren.

Für ein besseres Verständnis sehen Sie sich dieses Diagramm des “flatMap”-Operators an:

Was als nächstes?

An diesem Punkt können Sie beginnen, Rx in Ihre Anwendung zu integrieren. Wählen Sie einfach eine der Bibliotheken für Ihre Plattform aus dieser Liste aus. Alle haben eine ziemlich gute Dokumentation, aber als Anfänger benötigen Sie möglicherweise einige zusätzliche Informationen, um Rx bestmöglich zu nutzen. Glücklicherweise gibt es heutzutage auf dem Markt viele gute Bücher für verschiedene Plattformen, die spezifische Anwendungsfälle von Rx-Bibliotheken beschreiben. Wenn Sie zum Beispiel mit Swift arbeiten, wie ich, empfehle ich Ihnen, in dieses RxSwift-Buch zu schauen, das vom Tutorial-Team von raywenderlich.com erstellt wurde.