Использование «ViewState» в RxSwift / MVVM - PullRequest
0 голосов
/ 04 июня 2018

Этот вопрос очень широкий, но я не уверен, на каком аспекте я должен сосредоточиться.У меня есть цель абстрагироваться от повторяющихся шаблонов моих экранов, таких как ошибки, загрузка, пустые данные.Представления, которые представляют эти состояния, не будут сильно меняться между многими экранами, которые у меня есть.Возможно, они могут быть параметризованы для обеспечения такой гибкости (например, showError(message: "404")).

Мне понравилась эта статья как метод инкапсуляции аспектов этого интерфейса, которые можно использовать повторно.

Но, похоже, это работает в императивном контексте.Итак, у меня есть вызов API, и я могу showError, а в ответе я могу hideError.Все отлично.

Теперь я использую подход RxSwift / MVVM, где каждый экран привязывается к входам и выходам.И я хотел бы упростить состояние, о котором мой экран знает, используя концепцию «Просмотр состояния».

Как вы можете видеть в этом фрагменте, я могу уменьшить много логики для одной наблюдаемой, которую отображает представление.

let getFoos: (String) -> Observable<FooViewStateState> = { query in
            fooService.perform(query)
                .map { results in
                    if results.isEmpty {
                        return ViewState.noResults(query: query)
                    } else {
                        return ViewState.matches(query: query, results: results.map { $0.name })
                    }
                }
                .startWith(ViewState.searching(query))
        }

Проблема в том, что при использовании enum ViewState егоТеперь мне непонятно, как использовать императивный API до "showLoading / hideLoading ... showError / hideError и т. д.", когда я включаю случаи этого перечисления.Если ViewState Observable испустит .loading, мне придется скрыть экран ошибок, скрыть пустой экран и т. Д.

...