Alamofire vs URLSession: μια σύγκριση για τη δικτύωση στο Swift

Το Alamofire και το URLSession σας βοηθούν να κάνετε αιτήματα δικτύου στο Swift. Το API URLSession αποτελεί μέρος του πλαισίου θεμελίωσης, ενώ το Alamofire πρέπει να προστεθεί ως εξωτερική εξάρτηση. Πολλοί προγραμματιστές αμφιβάλλουν εάν χρειάζεται να συμπεριληφθεί μια επιπλέον εξάρτηση από κάτι βασικό όπως η δικτύωση στο Swift. Στο τέλος, είναι τελείως εφικτή η υλοποίηση ενός στρώματος δικτύωσης με τα εξαιρετικά API URLSession που είναι διαθέσιμα στις μέρες μας.

Αυτή η ανάρτηση ιστολογίου είναι εδώ για να συγκρίνετε τα δύο πλαίσια και να μάθετε πότε να προσθέσετε το Alamofire ως εξωτερική εξάρτηση.

Αυτό δείχνει την πραγματική δύναμη του Alamofire καθώς το πλαίσιο κάνει πολλά πράγματα ευκολότερα.

Τι είναι το Alamofire;

Όπου η URLSession μπορεί να βρεθεί στο πλαίσιο του βασικού πλαισίου του Ιδρύματος, πρέπει να προχωρήσουμε στο Github για να βρούμε το Alamofire. Είναι ένα ανοιχτό πλαίσιο και ανήκει στο Alamofire Software Foundation. Το πλαίσιο είναι πολύ δημοφιλές όπως μπορείτε να διαβάσετε από τα στατιστικά στοιχεία τη στιγμή της σύνταξης αυτής της ανάρτησης στο blog:

  • 164 συνεισφέροντες
  • 30K + αστέρια
  • 42 εκατομμύρια (!) Λήψεις σύμφωνα με τα στατιστικά CocoaPods και 600K + εφαρμογές που το χρησιμοποιούν

Αυτά τα στατιστικά στοιχεία καθιστούν ένα από τα πιο δημοφιλή διαθέσιμα πλαίσια Swift. Είναι ένα καλά διατηρημένο, συχνά χρησιμοποιούμενο πλαίσιο το οποίο θα σας διευκολύνει στην υλοποίηση δικτύωσης στις εφαρμογές σας.

Το Alamofire πήρε το όνομά του από το λουλούδι Alamo Fire, μια υβριδική παραλλαγή του Bluebonnet, το επίσημο κρατικό λουλούδι του Τέξας.

Alamofire και URLSession σε σύγκριση

Έχω ζητήσει από τους οπαδούς μου στο Twitter τι προτιμούν να χρησιμοποιούν: Alamofire ή URLSession.

Αποδεικνύεται ότι υπάρχει σαφής διαχωρισμός μεταξύ προγραμματιστών που προτιμούν να χρησιμοποιούν το Alamofire ή το URLSession. Ένα μεγάλο ερώτημα εδώ είναι αν το προτιμούν μόνο ή αν πραγματικά επιλέγουν να πάνε με το πλαίσιο επιλογής επίσης.

Το Alamofire διαφημίζεται ως "Elegant Networking in Swift" το οποίο δίνει ήδη την πρόθεσή του. Είναι ένα στρώμα πάνω από το URLSession με στόχο την ευκολότερη υλοποίηση κοινών λειτουργιών δικτύωσης.

Χαρακτηριστικά τα οποία είναι πιο εύκολα υλοποιήσιμα με το Alamofire

Το Alamofire περιέχει πολλή επιπλέον λογική εκτός από την απλή οικοδόμηση ενός αιτήματος δικτύωσης. Αυτά τα χαρακτηριστικά μπορούν να κάνουν τη διαφορά και μπορεί μερικές φορές να σας εξοικονομήσουν πολύ χρόνο σε σύγκριση με την κατασκευή τους μόνοι σας.

Ο κατάλογος των χαρακτηριστικών που διαφημίζονται στο χώρο αποθήκευσης readme είναι μακρύς, από τον οποίο μόνο μερικοί από αυτούς προσθέτουν πραγματικά μοναδική επιπλέον αξία:

  • Πιστοποίηση του πιστοποιητικού. Μπορεί να χρειαστεί λίγος χρόνος για να το λύσετε και να το κατασκευάσετε μόνοι σας.
  • Ζητάει την επανάληψη. Όταν μια αίτηση αποτύχει, για παράδειγμα, εξαιτίας μιας αποτυχίας ελέγχου ταυτότητας, μπορείτε εύκολα να ανανεώσετε το διακριτικό ελέγχου ταυτότητας και να καλέσετε πάλι το ίδιο αίτημα χωρίς να αγγίξετε τον κώδικα εφαρμογής.

Εκτός από αυτά τα χαρακτηριστικά, η σύνταξη για την δημιουργία αιτημάτων είναι πολύ πιο κομψή και ευκολότερη στη χρήση. Σας εξοικονομεί από πολύ επιπλέον κώδικα και κάνει πολύ πιο εύκολη την επικύρωση και το χειρισμό σφαλμάτων.

Συχνά θεωρείται ως πλεονέκτημα ο διαχειριστής προσβασιμότητας δικτύου. Ωστόσο, από το iOS 12 μπορούμε να χρησιμοποιήσουμε και το νέο NWPathMonitor API.

Δημιουργία σύγκρισης ενός αιτήματος δικτύου

Ας υποθέσουμε ότι διαθέτουμε ένα API το οποίο μας επιτρέπει να δημιουργήσουμε ένα νέο πίνακα με τίτλο "Highlights της Ν. Υόρκης". Για αυτό, χρησιμοποιώντας το Alamofire, ο κώδικας είναι πολύ εύκολος:

Αναζήτηση "AF.request" ("https://api.mywebserver.com/v1/board", μέθοδος: .get, παράμετροι: ["title": "Νέα Υόρκη"])
    .επιβεβαίωση (statusCode: 200 .. <300)
    .responseDecodable {(απόκριση: DataResponse) στο
        switch response.result {
        περίπτωση επιτυχίας (αφήστε το σκάφος):
            print ("Ο δημιουργούμενος τίτλος του πίνακα είναι \ (board.title)") // New York Highlights
        περίπτωση αθέτησης (ας σφάλμα):
            print ("Η δημιουργία του πίνακα απέτυχε με σφάλμα: \ (error.localizedDescription)")
        }}
}}

Κάνοντας ακριβώς το ίδιο με το API URLSession απαιτεί λίγο περισσότερη δουλειά.

enum Σφάλμα: Swift.Error {
    αίτημα υποβάθρουΦαπλισμένο
}}

// Δημιουργία της διεύθυνσης URL
var components = URLComponents (συμβολοσειρά: "https://api.mywebserver.com/v1/board")!
: {(κλειδί, τιμή) στο
    URLQueryItem (όνομα: κλειδί, τιμή: τιμή)
}}

// Δημιουργήστε και εκτελέστε το αίτημα
ας ζητήσουμε = δοκιμάστε! URLRequest (url: components.url !, μέθοδος: .get)
URLSession.shared.dataTask (με: αίτημα) {(δεδομένα, απόκριση, σφάλμα) στο
    κάνω {
        φύλακας ας δεδομένα = δεδομένα,
            ας απάντηση = απάντηση ως; HTTPURLResponse, (200 .. <300) ~ = response.statusCode,
            σφάλμα == κανένας άλλος {
            // Τα δεδομένα ήταν μηδέν, η επικύρωση απέτυχε ή προέκυψε σφάλμα.
            ρίξει λάθος; Error.requestFailed
        }}
        αφήστε το board = try JSONDecoder () decode (Board.self, από: data)
        print ("Ο δημιουργούμενος τίτλος του πίνακα είναι \ (board.title)") // New York Highlights
    } σύλληψη {
        print ("Η δημιουργία του πίνακα απέτυχε με σφάλμα: \ (error.localizedDescription)")
    }}
}}

Αυτό δείχνει την πραγματική δύναμη του Alamofire καθώς το πλαίσιο κάνει πολλά πράγματα ευκολότερα:

  • Το αίτημα δημιουργείται μέσα σε ένα μόνο αρχικοποιητή
  • Ένας κωδικοποιητής URL κωδικοποιεί τις παραμέτρους από προεπιλογή
  • Η επικύρωση πραγματοποιείται εν σειρά με μια απλή μεμονωμένη επένδυση και μετατρέπεται σε ένα σφάλμα έντονα τυπωμένο αν αποτύχει η επικύρωση. Το enum του αποτελέσματος απόκρισης θα επιστρέψει αυτό το σφάλμα στο εσωτερικό της διαδικασίας αποτυχίας.
  • Μια γενική επιστροφή κλήσης καθιστά εύκολη την αποκωδικοποίηση της απόκρισης στον προσαρμοσμένο τύπο πίνακα

Αυτό μόνο θα μπορούσε να είναι ήδη ένας λόγος για να επιλέξει για Alamofire και να κάνει τη ζωή σας πιο εύκολη. Με τη χρήση του URLSession είναι πιθανό να καταλήξετε να φτιάξετε το δικό σας περιτύλιγμα, το οποίο απαιτεί συντήρηση και δοκιμή. Αρχικά, αυτό φαίνεται να είναι μια καλύτερη απόφαση σε σύγκριση με την προσθήκη μιας νέας εξάρτησης, αλλά καθώς τα έργα εξελίσσονται, θα μπορούσε εύκολα να γίνει το δικό σας στρώμα δικτύωσης να εξελίσσεται και να γίνεται πιο περίπλοκο.

Πόσο θα ήταν άσχημη η προσθήκη του Alamofire ως εξάρτησης;

Ας ξεκαθαρίσουμε ότι πρέπει να είστε προσεκτικοί όταν προσθέτετε εξωτερική εξάρτηση στο έργο σας. Όταν δεν διατηρείται, δοκιμάζεται ή δεν χρησιμοποιείται πολύ, μπορεί να προσθέσει έναν πιθανό κίνδυνο στο έργο σας. Στο τέλος, μπορεί να χρειαστεί να συνεχίσετε την ανάπτυξη μόνοι σας.

Στην περίπτωση του Alamofire, δεν χρειάζεται να ανησυχείτε για αυτό. Το πλαίσιο είναι καλά συντηρημένο, δοκιμασμένο και χρησιμοποιείται. Το πλαίσιο είναι αρκετά μικρό και το κάνει πιο κομψό για να γράψει τα αιτήματα δικτύου.

Συμπέρασμα: Πώς να λάβετε την απόφαση;

Το Alamfore συχνά συγκρίνεται με το AFNetworking, το ισοδύναμο πλαίσιο Objective-C για δικτύωση. Την εποχή εκείνη, η δικτύωση ήταν πολύ πιο δύσκολη χωρίς το URLsession API που υπάρχει μόνο από το iOS 7. Ως εκ τούτου, ήταν πιο προφανές να επιλέξουμε ένα πλαίσιο όπως το AFNetworking για να κάνουμε τη ζωή σας λίγο πιο εύκολη.

Σήμερα, εξετάζοντας τα διαθέσιμα API URLSession, είναι πολύ πιο εύκολο να δημιουργήσετε αιτήματα δικτύου. Ωστόσο, αυτό θα σας οδηγήσει πιθανότατα στην οικοδόμηση του δικού σας στρώματος δικτύωσης πάνω από το URLSession. Αυτό το στρώμα πρέπει να εξεταστεί και μπορεί να εξελιχθεί σε ένα πιο περίπλοκο στρώμα καθώς το σχέδιό σας εξελίσσεται.

Με αυτό κατά νου, λαμβάνοντας το γεγονός ότι το Alamofire είναι καλά συντηρημένο και χρησιμοποιείται από πολλά έργα, πιθανότατα εξοικονομείτε τον εαυτό σας πολύ ταλαιπωρία και χρόνο προσθέτοντας Alamofire ως εξάρτηση.

Αυτή η ανάρτηση στο blog συγκρίνει το URLSession με το Alamofire 5, το οποίο είναι βήτα τη στιγμή της γραφής. Μπορείτε να διαβάσετε περισσότερα για αυτή την έκδοση εδώ.

Αρχικά δημοσιεύθηκε στο SwiftLee.

Περισσότερες αναρτήσεις και ενημερώσεις: @twannl