Alamofire срещу URLSession: сравнение за работа в мрежа в Swift

Alamofire и URLSession ви помагат да правите мрежови заявки в Swift. API API на сесията е част от основата на рамката, докато Alamofire трябва да бъде добавен като външна зависимост. Много разработчици се съмняват дали е необходимо да се включи допълнителна зависимост от нещо основно като мрежата в Swift. В крайна сметка е напълно възможно да се реализира мрежов слой с страхотния API на URL URL сесията, който е наличен в наши дни.

Тази публикация в блога е тук, за да сравнява двете рамки и да разбере кога да добавите Alamofire като външна зависимост.

Това показва реалната сила на Alamofire, тъй като рамката прави много неща по-лесни.

Какво е Alamofire?

Където URLSession може да се намери в стандартната рамка на фондацията, трябва да продължим на Github, за да намерим Alamofire. Това е отворена рамка и е собственост на софтуерната фондация Alamofire. Рамката е много популярна, както можете да прочетете от статистиката в момента на писане на този блог:

  • 164 сътрудници
  • 30K + звезди
  • 42 милиона (!!) изтегляния според статистиката на CocoaPods и 600K + приложения, които го използват

Тези статистики го правят една от най-популярните налични рамки на Swift. Това е добре поддържана, често използвана рамка, която трябва да улесни прилагането на мрежите във вашите приложения.

Alamofire е кръстен на цветето Alamo Fire, хибриден вариант на Bluebonnet, официалното държавно цвете на Тексас.

Сравнени са Alamofire и URLSession

Попитах моите последователи в Twitter какво предпочитат да използват: Alamofire или URLSession.

Оказва се, че има ясно разделение между разработчиците, които предпочитат да използват Alamofire или URLSession. Голям въпрос тук е дали те предпочитат само това или дали всъщност решат да отидат и с рамката на избор.

Alamofire се рекламира като „Елегантна мрежа в Swift“, което отдаде намерението си вече малко. Това е слой отгоре на URL сесията с цел да се улеснят общите функции на мрежата.

Функции, които са по-лесни за изпълнение с Alamofire

Alamofire съдържа много допълнителна логика освен просто изграждане на мрежова заявка. Тези функции могат да направят промяна и понякога могат да ви спестят много време в сравнение с изграждането им сами.

Списъкът с функции, рекламирани в readme на тяхното хранилище, е дълъг, от който само няколко от тях наистина добавят уникална допълнителна стойност:

  • Фиксиране на сертификат. Може да отнеме известно време, за да разрешите това и да изградите това сами.
  • Иска повторен опит. Когато заявката не успее, например, поради неуспех при удостоверяване, можете лесно да опресните маркера си за удостоверяване и отново да извикате същата заявка, без да докосвате кода за изпълнение.

Освен тези функции, синтаксисът за изграждане на заявки е много по-елегантен и лесен за използване. Това ви спестява от много допълнителен код и прави валидирането и обработката на грешки много по-лесно.

Често се разглежда като предимство е мениджърът за достъпност на мрежата. Въпреки това, тъй като iOS 12 можем да се възползваме и от новия API на NWPathMonitor.

Изграждане на мрежова заявка в сравнение

Да речем, че имаме API, който ни позволява да създадем нов съвет със заглавие „New York Highlights“. За това с помощта на Alamofire кодът е много лесен:

AF.request ("https://api.mywebserver.com/v1/board", метод: .get, параметри: ["title": "New York Highlights"])
    .валида (statusCode: 200 .. <300)
    .responseDecodable {(отговор: DataResponse) в
        превключване на реакцията.резултат {
        случай .успех (нека борда):
            print ("Създаденото заглавие на дъската е \ (board.title)") // New York Highlights
        case .failure (нека грешка):
            print ("Създаването на платката не бе успешно с грешка: \ (error.localizedDescription)")
        }
}

Направете същото като API на URL сесията изисква малко повече работа.

enum Грешка: Swift.Error {
    искане на случая
}

// Създаване на URL
var компоненти = URLComponents (низ: "https://api.mywebserver.com/v1/board")!
components.queryItems = ["title": "Акценти в Ню Йорк"]. карта {(ключ, стойност) в
    URLQueryItem (име: ключ, стойност: стойност)
}

// Генериране и изпълнение на заявката
нека искане = опитайте! URLRequest (URL: components.url !, method: .get)
URLSession.shared.dataTask (с: заявка) {(данни, отговор, грешка) в
    направете {
        охрана нека данни = данни,
            нека отговор = отговор като? HTTPURLResponse, (200 .. <300) ~ = response.statusCode,
            грешка == нула друго {
            // Данните бяха нулеви, валидирането не бе успешно или възникна грешка.
            грешка при хвърляне ?? Error.requestFailed
        }
        нека Board = опитайте JSONDecoder (). decode (Board.self, от: data)
        print ("Създаденото заглавие на дъската е \ (board.title)") // New York Highlights
    } улов {
        print ("Създаването на платката не бе успешно с грешка: \ (error.localizedDescription)")
    }
}

Това показва реалната сила на Alamofire, тъй като рамката прави много неща по-лесни:

  • Заявката се изгражда в рамките на един инициализатор
  • URL кодът по подразбиране кодира параметри
  • Валидирането се извършва на линия с обикновен еднолинейни и се превръща в силно набрана грешка, ако валидирането не успее. Enum резултата от отговора ще върне тази грешка в случая на отказ.
  • Общият обратен сигнал за завършване прави лесно декодирането на отговора в нашия персонализиран тип Board

Това само може да е причина да изберете за Alamofire и да улесните живота си. С използването на URLSession вероятно ще свършите да направите своя собствена обвивка, което изисква поддръжка и тестване. Отначало това може да изглежда по-добро решение в сравнение с добавянето на нова зависимост, но с развитието на проектите лесно може да се окаже, че вашият собствен мрежов слой се развива и се усложнява.

Колко лошо би било да се добави Alamofire като зависимост?

Нека поясним, че трябва да бъдете внимателни, когато добавяте външна зависимост към проекта си. Когато не се поддържа, тества или не се използва много, това може да добави възможен риск за вашия проект. В крайна сметка може да се наложи да продължите развитието сами.

В случая с Alamofire, не е нужно наистина да се тревожите за това. Рамката е добре поддържана, тествана и използвана. Рамката е доста малка и прави по-елегантно да се пишат мрежови заявки.

Заключение: Как да вземем решението?

Alamfore често се сравнява с AFNetworking, еквивалентната рамка на Objective-C за работа в мрежа. По онова време работата в мрежа беше много по-трудна без API за притежаване на URL, който съществува само от iOS 7. Следователно беше много по-очевидно да изберете за рамка като AFNetworking, за да улесните живота си.

В днешно време, гледайки наличните API-та на URL сесията, е много по-лесно да изградите мрежови заявки. Въпреки това, това вероятно ще ви насочи към изграждането на свой собствен мрежов слой върху URLSession. Този слой трябва да бъде тестван и потенциално може да нарасне към по-сложен слой с развитието на вашия проект.

Имайки това предвид, като се има предвид факта, че Alamofire е добре поддържан и използван от много проекти, вероятно ще си спестите много караница и време, като добавите Alamofire като зависимост.

Тази публикация в блога сравнява URLSession с Alamofire 5, който е в бета към момента на писане. Можете да прочетете повече за това издание тук.

Първоначално публикуван в SwiftLee.

Още публикации и актуализации: @twannl