Arbeiter sauberer schneller Architektur

Hallo Leser!

Zuvor haben wir untersucht, wie der VIP- Zyklus angeordnet ist und wie Übergänge zwischen Preisen und Datenübertragung vorgenommen werden können. Jetzt müssen Sie herausfinden, wie Sie unseren Interactor aus einer Überfülle an Logik entladen und einen Teil davon zur Wiederverwendung durch andere Szenen herausnehmen können. Und die Arbeiter werden uns dabei helfen. Das Thema ist recht bescheiden, aber wichtig zu erwähnen.



Theorie


Arbeiter sind Hilfsklassen / -strukturen (nicht zu verwechseln mit Diensten oder Helfern), deren Aufgabe es ist, einen Teil der Geschäftslogik von Interactor zu übernehmen. Wenn die Methoden in Interactor erweitert werden, ist es Zeit, die umfangreiche Logik in Worker zu entfernen . In Clean Swift werden sie verwendet, um mit der Logik der Datenspeicherung, mit dem Netzwerk, mit einzelnen Ebenen der Anwendung usw. zu arbeiten. Mit anderen Worten, alles ist umfangreich, auf niedriger Ebene und hängt nicht mit der Geschäftslogik der Anwendung zusammen.

Die Arbeitnehmer werden in zwei Haupttypen unterteilt:

  1. Lokal , die nur innerhalb der Szene verwendet werden.
  2. Global , die für jede Szene verfügbar sind.

Lokale Arbeiter werden direkt in die Szene gestellt und nach ihr benannt - SceneNameWorker . Globale Worker befinden sich im Workers- Stammverzeichnis und werden nach ihrem Betreff benannt. Lokale Arbeiter können auch als „Dekorateure über global“ fungieren, mit erweiterter Logik für die Bedürfnisse der Szene.

Wenn Sie die Aufteilung des Projekts in Ebenen ( Präsentation , Geschäftslogik , Persistenz , Netzwerklogik ) verwenden, kann die Rolle der Verbindungsbrücke zwischen der Präsentationsebene und der Geschäftslogik den Mitarbeitern zugewiesen werden . Auf diese Weise werden wir Interactor entladen, ein vorhersehbareres Verhalten erzielen und die Wiederverwendung vereinfachen.

Übe


Die Arbeit der Arbeiter werden wir am Beispiel der Arbeit mit dem Netzwerk betrachten. Wir werden zwei Bildschirme haben - auf dem ersten wird eine Liste der Benutzer angezeigt und auf dem zweiten eine Liste der Beiträge dieses Benutzers. Alle Daten werden von der API erfasst . Wir werden diese Aufgabe in drei Arbeiter aufteilen, zwei lokale und einen globalen, die als Einstiegspunkt für die beiden anderen dienen. Ich werde die Implementierung der Methoden selbst im Artikel verbergen, und wer es in der Praxis ausprobieren möchte, wird am Ende des Artikels einen Link zum fertigen Projekt finden.



Diese Projektstruktur ist keine Referenz für die Arbeit mit einem Netzwerk und spiegelt in keiner Weise die Arbeitsweise in Clean Swift wider. All dies geschieht nur als gutes Beispiel für die Rolle lokaler und globaler Arbeitnehmer .

Erstellen Sie zunächst einen globalen Worker - NetworkWorker . Platzieren Sie es im Workers- Verzeichnis auf derselben Ebene wie das Scenes- Verzeichnis. Im folgenden Beispiel gibt es eine sendRequest-Methode (to: params: Completion) , die lokalen Workern gemeinsam ist. Es führt eine Routineaufgabe aus - bildet eine Verknüpfung aus den Parametern, sendet eine Anforderung und sendet das Ergebnis zum Abschluss .

struct NetworkWorker { // MARK: - Private Properties private let session = URLSession.shared // MARK: - Public Methods ///  Worker.    API /// /// - Parameters: /// - to: ,     /// - params:    /// - completion:     func sendRequest(to: URL, params: [String: String], completion: @escaping (Data?, Error?) -> Void) { // ... } } 

Für die erste Szene benötigen wir eine API- Liste aller Benutzer. Dazu erstellen wir einen lokalen HomeWorker , der die Parameter zum Laden von Benutzern konfiguriert und sendRequest (to: params: finish) in NetworkWorker mit diesen Parametern aufruft . Jetzt müssen wir im Interactor der Szene fetchUsers aufrufen (Vervollständigung :) und die empfangenen Daten zur Verarbeitung an Presenter senden.

Wenn Sie auf eine Tabellenzelle mit dem Benutzernamen klicken, werden wir den Übergang vornehmen und den ausgewählten Benutzer in eine andere Szene übertragen.

 struct HomeWorker { // MARK: - Private Properties private let networkWorker = NetworkWorker() private let usersURL = URL(string: "https://jsonplaceholder.typicode.com/users") // MARK: - Public Methods ///  Worker.   API     /// /// - Parameter complete:     func fetchUsers(_ complete: @escaping ([User]?) -> Void) { // ... } } 

Auf der Seite mit Benutzerbeiträgen erstellen wir PostsWorker , jedoch nur mit der Methode fetchPosts (Benutzer-ID: abgeschlossen :) . Darin übergeben wir die ID des Benutzers, dessen Beiträge Sie herunterladen möchten. In der Methode bilden wir die Parameter und rufen sendRequest (to: params: finish) in NetworkWorker auf . Und auf die gleiche Weise wie zuvor rufen wir die Methode fetchPosts (userId: complete :) im Interactor der Szene auf und übergeben die empfangenen Daten an den Presenter .

 struct PostsWorker { // MARK: - Private Properties private let networkWorker = NetworkWorker() private let postsURL = URL(string: "https://jsonplaceholder.typicode.com/posts") // MARK: - Public Methods ///   API      /// /// - Parameters: /// - userId: ID ,     /// - completed:     func fetchPosts(userId: Int, _ completed: @escaping ([Post]?) -> Void) { // ... } } 

Jetzt wurde unsere gesamte Implementierung in separate Dateien verschoben, die wiederverwendet werden können, ohne die Geschäftslogik in Interactor zu laden.

Fazit


Obwohl die Mitarbeiter sehr einfach sind und kein verstecktes Wissen über Architektur preisgeben, ist ihre Verwendung in Clean Swift wichtig. Vergessen Sie beim Schreiben von Workers nicht Protokolle, Strukturmuster und DI. Andernfalls bilden Sie schnell ein Durcheinander von Arbeitern , bei dem alles, was herausgenommen werden konnte, in Stücken herausgenommen wurde.

Das ist alles. Vielen Dank für das Lesen bis zum Ende. Unten finden Sie einen Link zum vollständigen Projekt.

Artikelserie


  1. Übersicht über die saubere Swift-Architektur
  2. Router- und Datenübergabe in einer sauberen Swift-Architektur
  3. Arbeiter der Clean Swift-Architektur (Sie sind hier)
  4. Unit-Tests in der Clean Swift-Architektur
  5. Ein Beispiel für eine einfache Online-Shop-Architektur Clean Swift

Link zum Projekt
Hilfe beim Schreiben eines Artikels: Bastien

Source: https://habr.com/ru/post/de465991/


All Articles