Задать вопрос

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

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

Похожие вопросы