Alamofire vs URLSession: srovnání pro vytváření sítí ve službě Swift

Alamofire a URLSession vám pomohou při vytváření síťových požadavků ve službě Swift. Rozhraní API URLSession je součástí základního rámce, zatímco Alamofire je třeba přidat jako externí závislost. Mnoho vývojářů pochybuje o tom, zda je třeba do Swift zahrnout další závislost na něčem základním, jako je vytváření sítí. Nakonec je naprosto proveditelné implementovat síťovou vrstvu s skvělými API API URLSession, která jsou dnes k dispozici.

Tento blogový příspěvek je zde proto, aby porovnal oba rámce a zjistil, kdy přidat Alamofire jako externí závislost.

To ukazuje skutečnou sílu Alamofire, protože rámec usnadňuje mnoho věcí.

Co je Alamofire?

Tam, kde lze URLSession nalézt ve standardním rámci Nadace, musíme jít do Githubu, abychom našli Alamofire. Je to otevřený zdrojový rámec a je ve vlastnictví Alamofire Software Foundation. Rámec je velmi populární, jak si můžete přečíst ze statistik v okamžiku psaní tohoto příspěvku na blogu:

  • 164 přispěvatelů
  • 30 K + hvězdy
  • 42 milionů (!!) stažení podle statistik CocoaPods a 600 000 aplikací, které ji používají

Tyto statistiky z něj činí jeden z nejpopulárnějších dostupných Swift frameworků. Je to dobře udržovaný, často používaný rámec, který by měl usnadnit implementaci sítí do vašich aplikací.

Alamofire je pojmenován po květu Alamo Fire, hybridní variantě Bluebonnetu, oficiálního státního květu Texasu.

Porovnání Alamofire a URLSession

Zeptal jsem se svých sledovatelů na Twitteru, co raději používají: Alamofire nebo URLSession.

Ukazuje se, že mezi vývojáři, kteří dávají přednost použití Alamofire nebo URLSession, je jasné oddělení. Velkou otázkou je, zda to pouze preferují, nebo zda se skutečně rozhodnou jít také s rámcem volby.

Alamofire je inzerován jako „Elegantní Networking in Swift“, který již svůj záměr trochu vzdává. Jedná se o vrstvu na vrcholu URLSession s cílem usnadnit implementaci běžných síťových funkcí.

Funkce, které se snáze implementují s Alamofire

Alamofire obsahuje spoustu další logiky kromě jednoduchého vytvoření požadavku na síť. Tyto funkce mohou změnit a někdy vám mohou ušetřit spoustu času ve srovnání s jejich samotným vytvářením.

Seznam funkcí inzerovaných v jejich readme repozitáře je dlouhý, z čehož jen několik z nich skutečně přidává jedinečnou přidanou hodnotu:

  • Připnutí certifikátu. Může to nějakou dobu trvat, než to vyřešíte a sami si to vybudujete.
  • Požaduje opakování. Pokud požadavek selže například z důvodu selhání ověřování, můžete snadno obnovit svůj ověřovací token a znovu vyvolat stejný požadavek, aniž byste se dotkli implementačního kódu.

Kromě těchto funkcí je syntaxe pro vytváření požadavků mnohem elegantnější a snadněji použitelná. Šetří vám to z mnohem více kódu a výrazně usnadňuje ověřování a zpracování chyb.

Za výhodu je často považován správce dosažitelnosti sítě. Od iOS 12 však můžeme využít i nové rozhraní NWPathMonitor API.

Budování síťového požadavku v porovnání

Řekněme, že máme API, které nám umožňuje vytvořit novou tabuli s názvem „New York Highlights“. Za tímto účelem je použití kódu Alamofire velmi snadné:

AF.request ("https://api.mywebserver.com/v1/board", metoda: .get, parametry: ["title": "New York Highlights"]))
    .validate (statusCode: 200 .. <300)
    .responseDecodable {(odpověď: DataResponse) v
        switch response.result {
        case .success (let board):
            print ("Vytvořený název desky je \ (board.title)") // New York Highlights
        case .failure (nechat chybu):
            print ("Vytvoření desky se nezdařilo s chybou: \ (error.localizedDescription)")
        }
}

Udělat přesně to samé s URLSession API vyžaduje trochu více práce.

enum Error: Swift.Error {
    žádost o případFailed
}

// Vytvořte URL
var components = URLComponent (string: "https://api.mywebserver.com/v1/board")!
components.queryItems = ["title": "New York Highlights"]. map {(key, value) in
    URLQueryItem (jméno: klíč, hodnota: hodnota)
}

// Vygenerovat a provést požadavek
let request = try! URLRequest (url: components.url !, metoda: .get)
URLSession.shared.dataTask (s: request) {(data, response, error) in
    dělat {
        hlídat let data = data,
            nechat odpověď = odpověď jako? HTTPURLResponse, (200 .. <300) ~ = response.statusCode,
            error == nula else {
            // Data byla nulová, ověření se nezdařilo nebo došlo k chybě.
            hodit chyba ?? Error.requestFailed
        }
        let board = try JSONDecoder (). dekódování (Board.self, z: data)
        print ("Vytvořený název desky je \ (board.title)") // New York Highlights
    } úlovek {
        print ("Vytvoření desky se nezdařilo s chybou: \ (error.localizedDescription)")
    }
}

To ukazuje skutečnou sílu Alamofire, protože rámec usnadňuje mnoho věcí:

  • Požadavek je vytvořen v rámci jednoho inicializátoru
  • Kodér URL je ve výchozím nastavení parametry kódování
  • Ověření se provádí v souladu s jednoduchou jednovrstvou linkou a v případě selhání ověření se převede na silně zadanou chybu. Výsledek výčtu odpovědí vrátí tuto chybu uvnitř případu selhání.
  • Obecné zpětné zavolání usnadňuje dekódování odpovědi na náš vlastní typ desky

To už mohl být důvod, proč jste se rozhodli pro Alamofire a usnadnili vám život. Při použití URLSession pravděpodobně skončí výroba vlastního obalu, který vyžaduje údržbu a testování. Zpočátku se to může zdát lepší rozhodnutí ve srovnání s přidáním nové závislosti, ale jak se projekty vyvíjejí, může se snadno stát, že se vaše vlastní síťová vrstva vyvíjí a stává se složitější.

Jak špatné by bylo přidat Alamofire jako závislost?

Vysvětlíme vám, že při přidávání externí závislosti do projektu musíte být opatrní. Pokud to není hodně udržováno, testováno nebo nepoužíváno, může to pro vaše projekt představovat možné riziko. Nakonec možná budete muset pokračovat ve vývoji sami.

V případě Alamofire si s tím nemusíte dělat starosti. Rámec je dobře udržován, testován a používán. Rámec je poměrně malý a díky tomu je psaní žádostí o síť elegantnější.

Závěr: Jak učinit rozhodnutí?

Alamfore je často srovnáván s AFNetworking, což je ekvivalentní rámec Objective-C pro síťování. V té době bylo vytváření sítí mnohem obtížnější bez API URLsession API, které existuje pouze od iOS 7. Proto bylo mnohem jasnější vybrat si rámec, jako je AFNetworking, který vám usnadní život.

V dnešní době, při pohledu na dostupná rozhraní API API URLSession, je mnohem snazší vytvářet síťové požadavky. Pokud tak učiníte, pravděpodobně vás posunete směrem k budování vlastní síťové vrstvy na vrcholu URLSession. Tato vrstva musí být otestována a může se případně vyvíjet směrem ke složitější vrstvě v průběhu vývoje vašeho projektu.

Vzhledem k tomu, že Alamofire je dobře udržovaný a používaný mnoha projekty, pravděpodobně si ušetříte spoustu potíží a času přidáním Alamofire jako závislosti.

Tento blogový příspěvek porovnává URLSession s Alamofire 5, který je v okamžiku psaní v beta verzi. Více o tomto vydání si můžete přečíst zde.

Původně publikováno na webu SwiftLee.

Další příspěvky a aktualizace: @twannl