RxSwift .asDriverOnErrorJustComplete () не является частью библиотеки ядра / утилиты - PullRequest
4 голосов
/ 13 марта 2019

Пытаясь выяснить, как создать приложение с помощью RxSwift и исследовать несколько проектов с открытым исходным кодом (а именно CleanArchitectureRxSwift и SwiftHub ), я часто нахожу использование

extension ObservableType {

    func asDriverOnErrorJustComplete() -> Driver<E> {
        return asDriver { error in
            return Driver.empty()
        }
    }

}

Учитывая, что этот метод полезен во многих ситуациях и буквально копируется в упомянутых проектах, мне интересно, почему он не является частью какой-либо служебной библиотеки (например, RxSwiftExt ) или даже самого RxSwift.

Я нахожу действительно подозрительным, что, учитывая, сколько Rx-модулей имеется в SwiftHub Podfile , ни один из них на самом деле не содержит эту функцию.

Мой вопрос заключается в том, есть ли реальные причины этого? asDriverOnErrorJustComplete как-то нарушает контракты Rx или считается плохой практикой и т.д.?

Неужели я склонен в том смысле, что эти два проекта, скорее всего, скопированы друг от друга и не являются репрезентативными? Если да, то есть ли какие-нибудь хорошие проекты с открытым исходным кодом, которые демонстрируют RxSwift + MVVM и, возможно, избегают asDriverOnErrorJustComplete или подходят к проблемам, решаемым с помощью asDriverOnErrorJustComplete по-другому?

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Я бы не назвал этот метод плохой практикой как таковой , но он допускает ошибку, которая будет игнорироваться, что мне не особенно нравится. Использование такой конструкции довольно пагубно в том смысле, что ваша цепь молча прекратит работу без какого-либо уведомления. Это может быть проблемой, если ваш отдел контроля качества (вы в другой шляпе?) Не замечает тот факт, что ярлык больше не обновляется.

Я также не большой поклонник определенных репозиториев GitHub, которые вы вызываете, потому что они добавляют много ненужных имхо IMHO. Я предпочитаю более прямой код.

В моем примере приложения RxEarthquake я использую следующее:

public func asDriverLogError(_ file: StaticString = #file, _ line: UInt = #line) -> SharedSequence<DriverSharingStrategy, E> {
    return asDriver(onErrorRecover: { print("Error:", $0, " in file:", file, " atLine:", line); return .empty() })
}

Так что, по крайней мере, запись ошибки сделана в отладке.

Я также считаю, что отличная альтернатива:

public func asDriverOrAbort(_ file: StaticString = #file, _ line: UInt = #line) -> SharedSequence<DriverSharingStrategy, E> {
    return asDriver(onErrorRecover: { fatalError("Error: \($0) in file: \(file) atLine: \(line)") })
}

Используя такой метод, вы даете читателю понять, что абсолютно уверены, что цепочка не выдаст ошибку.

2 голосов
/ 14 марта 2019

Я думаю, asDriverOnErrorJustComplete не входит в стандартную библиотеку, потому что с любым типом наблюдаемых, кроме void, приложение будет аварийно завершать работу при получении ошибки.

Когда я начал писать SwiftHub, яне могу понять, почему происходит сбой приложения, когда я получил сообщение об ошибке с сервера:)

...