Элегантный способ проверки разрешения в Android с помощью MVVM - PullRequest
0 голосов
/ 06 февраля 2019

Итак, я использую архитектуру MVVM с шаблоном Repository для выполнения различных вызовов API.У меня есть репозиторий под названием X, в котором у меня есть различные связанные вызовы API.

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

fun getSomethingX(data: Data): Single<Data> {
    return if (validation(data)) {
        service.getSomethingX()
                .onErrorResumeNext(...)
                .map { ... ->
                    ...
                }
    } else {
        Single.just(null)
    }
}

fun getSomethingY(data: Data): Single<Data> {
    return if (validation(data)) {
        service.getSomethingX()
                .onErrorResumeNext(...)
                .map { ... ->
                    ...
                }
    } else {
        Single.just(null)
    }
 } 

Как видите, у меня может быть много функций сетевого запроса, называемых getSomething..().Я вижу это как код котельной плиты.

  1. Существуют ли другие способы проверки (не только проверка токена, но и разрешение в целом)?Если да, можете ли вы показать мне пример?

  2. Можно ли проводить проверку разрешений на уровне хранилища?

  3. Возможно, лучший подходбудет делать проверку в Interceptor?Но я не вижу чистого способа отменить запрос, если проверка не прошла.

1 Ответ

0 голосов
/ 06 февраля 2019

Лучшим подходом будет сохранить валидацию только на уровне репозитория и по возможности сохранять тупость вашей модели представления.Это очень просто с литералами функций Котлина с получателем .

В вашем хранилище

fun getSomethingX(
   data: Data,
   onSuccess: (Single<Data>) -> Unit,
   onError: (String) -> Unit
) {
   if (validation(data)) {
      // Do the network call 
      onSuccess(//pass result)
   } else onError(“Invalid data”)
} 

В вашей ViewModel

repository.getSomethingX(
   data,
   onSuccess = {
        //it will give you Single<Data>
        //Update the value
    },
    onError = {
        //Emit error to view 
    }
)
...