Alamofire vs URLSession: ein Vergleich für die Vernetzung in Swift

Alamofire und URLSession helfen Ihnen, Netzwerkanforderungen in Swift zu stellen. Die URLSession-API ist Teil des Foundation-Frameworks, während Alamofire als externe Abhängigkeit hinzugefügt werden muss. Viele Entwickler bezweifeln, dass eine zusätzliche Abhängigkeit von etwas Grundlegendem wie dem Networking in Swift erforderlich ist. Letztendlich ist es perfekt möglich, eine Netzwerkebene mit den großartigen URLSession-APIs zu implementieren, die heutzutage verfügbar sind.

In diesem Blog-Beitrag werden beide Frameworks verglichen und es wird herausgefunden, wann Alamofire als externe Abhängigkeit hinzugefügt werden muss.

Dies zeigt die wahre Kraft von Alamofire, da das Framework viele Dinge einfacher macht.

Was ist Alamofire?

Wo sich URLSession im Standard-Foundation-Framework befindet, müssen wir auf Github nach Alamofire suchen. Es handelt sich um ein Open-Source-Framework, das der Alamofire Software Foundation gehört. Das Framework ist sehr beliebt, da Sie im Moment des Schreibens dieses Blogposts aus den Statistiken lesen können:

  • 164 Mitwirkende
  • 30K + Sterne
  • 42 Millionen (!!) Downloads laut CocoaPods-Statistiken und mehr als 600.000 Apps, die es verwenden

Diese Statistiken machen es zu einem der beliebtesten verfügbaren Swift-Frameworks. Es handelt sich um ein gut gepflegtes, häufig verwendetes Framework, das die Implementierung des Netzwerks in Ihre Apps erleichtern soll.

Alamofire ist nach der Alamo Fire-Blume benannt, einer Hybridvariante des Bluebonnet, der offiziellen Staatsblume von Texas.

Alamofire und URLSession verglichen

Ich habe meine Follower auf Twitter gefragt, was sie bevorzugen: Alamofire oder URLSession.

Es stellt sich heraus, dass es eine klare Trennung zwischen Entwicklern gibt, die Alamofire oder URLSession bevorzugen. Eine große Frage ist hier, ob sie es nur vorziehen oder ob sie sich tatsächlich auch für den Rahmen der Wahl entscheiden.

Alamofire wird als „Elegant Networking in Swift“ beworben, was seine Absicht schon etwas verrät. Es ist eine Schicht über URLSession mit dem Ziel, die Implementierung gemeinsamer Netzwerkfunktionen zu vereinfachen.

Funktionen, die mit Alamofire einfacher zu implementieren sind

Alamofire enthält viel zusätzliche Logik, abgesehen vom einfachen Erstellen einer Netzwerkanforderung. Diese Funktionen können einen Unterschied machen und manchmal viel Zeit sparen, verglichen mit dem Erstellen selbst.

Die Liste der Funktionen, die in ihrer Repository-Readme-Datei angekündigt werden, ist lang, und nur einige von ihnen bieten einen einzigartigen Mehrwert:

  • Anheften des Zertifikats. Es kann einige Zeit dauern, dies zu klären und selbst aufzubauen.
  • Anfragen werden wiederholt. Wenn eine Anforderung beispielsweise aufgrund eines Authentifizierungsfehlers fehlschlägt, können Sie Ihr Authentifizierungstoken problemlos aktualisieren und dieselbe Anforderung erneut aufrufen, ohne den Implementierungscode zu berühren.

Abgesehen von diesen Funktionen ist die Syntax zum Erstellen von Anforderungen wesentlich eleganter und benutzerfreundlicher. Dies erspart Ihnen viel zusätzlichen Code und erleichtert die Validierung und Fehlerbehandlung erheblich.

Als Vorteil wird häufig der Netzwerk-Erreichbarkeits-Manager angesehen. Seit iOS 12 können wir jedoch auch die neue NWPathMonitor-API verwenden.

Aufbau einer Netzwerkanfrage im Vergleich

Nehmen wir an, wir haben eine API, mit der wir ein neues Board mit dem Titel "New York Highlights" erstellen können. Dafür ist der Code mit Alamofire sehr einfach:

AF.request ("https://api.mywebserver.com/v1/board", Methode: .get, Parameter: ["title": "New York Highlights"])
    .validate (statusCode: 200 .. <300)
    .responseDecodable {(Antwort: DataResponse) in
        switch response.result {
        case .success (let board):
            print ("Erstellt Board-Titel ist \ (board.title)") // New York Highlights
        case .failure (let error):
            print ("Boarderstellung fehlgeschlagen mit Fehler: \ (error.localizedDescription)")
        }
}

Genau das Gleiche mit der URLSession-API zu tun, erfordert etwas mehr Arbeit.

Aufzählungsfehler: Swift.Error {
    Anfrage fehlgeschlagen
}

// URL aufbauen
var components = URLComponents (Zeichenfolge: "https://api.mywebserver.com/v1/board")!
components.queryItems = ["title": "New York Highlights"]. map {(Schlüssel, Wert) in
    URLQueryItem (Name: Schlüssel, Wert: Wert)
}

// Generiere die Anfrage und führe sie aus
Anfrage lassen = ausprobieren! URLRequest (URL: components.url !, Methode: .get)
URLSession.shared.dataTask (mit: request) {(Daten, Antwort, Fehler) in
    machen {
        Wache ließ Daten = Daten,
            Antwort = Antwort als? HTTPURLResponse, (200 .. <300) ~ = response.statusCode,
            error == nil else {
            // Daten waren Null, Validierung fehlgeschlagen oder ein Fehler ist aufgetreten.
            werfen Fehler? Error.requestFailed
        }
        let board = probiere JSONDecoder (). decode (Board.self, from: data)
        print ("Erstellt Board-Titel ist \ (board.title)") // New York Highlights
    } Fang {
        print ("Boarderstellung fehlgeschlagen mit Fehler: \ (error.localizedDescription)")
    }
}

Dies zeigt die wahre Kraft von Alamofire, da das Framework viele Dinge einfacher macht:

  • Die Anfrage wird in einem einzigen Initialisierer aufgebaut
  • Ein URL-Encoder codiert standardmäßig Parameter
  • Die Validierung erfolgt inline mit einem einfachen Einzeiler und wird in einen stark typisierten Fehler umgewandelt, wenn die Validierung fehlschlägt. Die Antwortergebnis-Aufzählung gibt diesen Fehler im Fehlerfall zurück.
  • Ein generischer Rückruf zur Vervollständigung macht es einfach, die Antwort in unseren benutzerdefinierten Board-Typ zu dekodieren

Dies könnte bereits ein Grund sein, sich für Alamofire zu entscheiden und Ihnen das Leben zu erleichtern. Wenn Sie URLSession verwenden, werden Sie wahrscheinlich Ihren eigenen Wrapper erstellen, der gewartet und getestet werden muss. Auf den ersten Blick scheint dies eine bessere Entscheidung zu sein, als eine neue Abhängigkeit hinzuzufügen. Mit der Entwicklung von Projekten kann es jedoch leicht vorkommen, dass sich Ihre eigene Netzwerkschicht weiterentwickelt und komplexer wird.

Wie schlimm wäre es, Alamofire als Abhängigkeit hinzuzufügen?

Machen wir klar, dass Sie vorsichtig sein müssen, wenn Sie Ihrem Projekt eine externe Abhängigkeit hinzufügen. Wenn es nicht gewartet, getestet oder nicht häufig verwendet wird, kann es ein mögliches Risiko für Ihr Projekt darstellen. Am Ende müssen Sie die Entwicklung möglicherweise selbst fortsetzen.

Im Fall von Alamofire müssen Sie sich darüber keine Sorgen machen. Das Framework wird gut gewartet, getestet und verwendet. Das Framework ist recht klein und macht es viel eleganter, Netzwerkanforderungen zu schreiben.

Fazit: Wie trifft man die Entscheidung?

Dies wird häufig mit AFNetworking verglichen, dem Objective-C-äquivalenten Framework für die Vernetzung. Zu dieser Zeit war das Networking ohne die URLsession-API, die es erst seit iOS 7 gibt, viel schwieriger. Daher war es naheliegender, sich für ein Framework wie AFNetworking zu entscheiden, um Ihnen das Leben ein wenig zu erleichtern.

Wenn man sich die verfügbaren URLSession-APIs ansieht, ist es heutzutage viel einfacher, Netzwerkanforderungen zu erstellen. Dies wird Sie jedoch wahrscheinlich dazu bewegen, eine eigene Netzwerkschicht über URLSession aufzubauen. Diese Ebene muss getestet werden und kann im Verlauf Ihres Projekts möglicherweise zu einer komplexeren Ebene werden.

Unter Berücksichtigung der Tatsache, dass Alamofire gut gewartet und für viele Projekte verwendet wird, sparen Sie sich wahrscheinlich viel Aufwand und Zeit, indem Sie Alamofire als Abhängigkeit hinzufügen.

In diesem Blog-Beitrag wird URLSession mit Alamofire 5 verglichen, das sich derzeit in der Beta-Version befindet. Weitere Informationen zu dieser Version finden Sie hier.

Ursprünglich bei SwiftLee veröffentlicht.

Weitere Beiträge und Updates: @twannl