Добрый день, совсем недавно начал изучать разработку под iOS, до этого был опыт с Android. В Android существуют такие замечательные инструменты, как:
*
Retrofit+
RxJava adapter - Работа с HTTP
* Gson - Маппинг JSON в Java-объекты
* RxJava - реактивные расширения для языка
Всё это в одной связке позволяет создать интерфейс ("протокол" в терминах Swift) типа такого:
interface MyService {
@GET("/user")
Observable<User> getUser();
}
И дальше в коде используется только метод, возвращающий Observable на результат, на который можно подписаться. Сам запрос (
GET http://mydomain.com/user
), маппинг и создание Observable происходит под капотом и эти вещи не мешают в дальнейшей разработке.
Хочу организовать аналогичное в Swift. Поиском в интернете по доступным библиотекам нашёл следующие популярные решения:
*
Alamofire как аналог Retrofit
*
ObjectMapper для маппинга JSON в объект
*
RxSwift,
RxAlamofire - реактивные расширения для Swift и обёртка для Alamofire
Однако имеются затруднения понять, как это всё связать между собой. Цель в том, чтобы создать один класс-сервис:
class MyService {
func getUser() -> Observable<User> {
// Запускаем асинхронный HTTP-запрос, маппим и возвращаем Observable. Как?
}
}
Т.е. по сути, необходимо сделать так, чтобы в методе
getUser() произошло следующее:
1. Alamofire делает запрос
2. Ответ (например
{"id":1,"name":"Jack"}
) передаётся на маппинг в модель:
struct User: ImmutableMappable {
let id: Int
let name: String
/// Маппим
init(map: Map) throws {
id = try map.value("id")
name = try map.value("name")
}
}
3. Результат маппинга (либо ошибка) передаётся Observer'у.
Возможно кто-то подобное делал или видел где и может поделиться сниппетами? Или может я упустил какую готовую библиотеку, которая, аналогично Retrofit'у, может взять на себя весь скучный бойлерплейт?
UPD:
Пока сделал так:
class MyService {
func getUser() -> Observable<User> {
return RxAlamofire.json(
.get,
"http://mydomain.com/user"
).map { json -> User in
return try Mapper<User>().map(JSONObject: json)
}
}
}
Печалит WET-бойлерплейт немного, в каждом методе одно и то же писать. Но да ладно, если у кого есть вариант почище -- пишите.