Как связать Alamofire+ObjectMapper+RxSwift по аналогии с Retrofit+Gson+RxJava в Android?

Добрый день, совсем недавно начал изучать разработку под 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-бойлерплейт немного, в каждом методе одно и то же писать. Но да ладно, если у кого есть вариант почище -- пишите.
  • Вопрос задан
  • 1059 просмотров
Пригласить эксперта
Ответы на вопрос 1
FirsofMaxim
@FirsofMaxim
android, java, kotlin developer
Спасибо за код, возможно вы за год оптимизировали его, можете сказать?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы