Как вернуть «Возможно» или результат «Может быть» - PullRequest
0 голосов
/ 08 июля 2019

Я нахожусь в Usecase, и у меня есть хранилище, где у меня есть все методы, которые я должен сделать, например:

class MyUseCase(
    private val myRepository: MyRepository
) {

    fun execute(example: String) { //First I don't know what to return here
    //Here I have to check if theres anything on the room db, for this I have this method
    myRepository.findLocally(example) // it returns a Maybe<MyObject>
    //Then if it returns an object I have to do another call that is 
    myRepository.findObject(example) //it will return a Maybe<List<OtherObject>>
    //So if we arrive to this, the usecase is done and I should return the last result.
    //if user doesn't search it before then I have to do an api call using
    myRepository.getFromApi(example) //it will return Single<List<OtherObject>>
    //When I get the result then I have to do two inserts using 
    myRepository.insertWord(example) : Completable
    //And then I want to add all the result from the api call it can be a List<MyObject> or a []
    myRepository.insertList(resultFromApi) : Completable

    }

}

Моя проблема в том, что я теперь знаю, каквыполнить все это или, если я должен разделить это или что-то, это вызывается из моего докладчика, поэтому я хочу вернуть своему докладчику данные, например, для вызова view.showData ().

Идея,должен выполнить это так:

if(myRepository.findLocally(example)) {
  return myRepository.findObject(example)
}
else{
  myRepository.getFromApi(example)
  myRepository.insertWord(example)
  myRepository.insertList(resultFromApi)
}


Редактировать

Я ищу способ сделать это с помощью RxJava.

Вот как я пытаюсь это сделать:

return myRepository.findLocally(example).flatMap {
            myRepository.findObject(example)
        }.switchIfEmpty {
            myRepository.getFromApi(example).flatMap { example ->
                example.flatMap {
                    myRepository.insertList(
                        MyExample(
                            it.id,
                            it.name,
                            it.description
                        )
                    )
                }
                myRepository.insertWord(example)

            }
        }

1 Ответ

0 голосов
/ 08 июля 2019

Метод 1:
Вы можете вернуть Any? объект

private val myRepository() : Any? {
    // Your stuff here
}

Any объект в основном означает, что вы можете вернуть все, что захотите, но будьте внимательны, чтобы проверить возвращение в родительском методе.
? означает, что вы также можете вернуть объект null. Проверьте это тоже в родительском методе.

Метод 2:
Или сделайте все эти вызовы из вашего метода, который вызывает этот, с if и else s

Метод 3:
Другой способ сделать это - вернуть оба типа указателей:

private val myRepository(resul1 : Object1, result2 : Object2, ...) {
    if (function_to_get_result1_fails)
        result1 = Object1() // You set result1 as a basic empty object of type Object1
    else if (function_to_get_result2_fails)
        result2 = Object2()
    // etc.
}

Затем, в вашем родительском методе, сделайте проверку следующим образом:

myRepository(object1, object2, ...)
if (object1.someDataInObject1 != -1) // Set an un-instancied variable as -1 to know if the object is empty or not
    doSomething()
else if (object2.someDataInObject2 != -1)
    doSomethingElse()
// etc.

Тем не менее, предпочтительнее метод 1, или, может быть, метод 2, но метод 3 «грязный» и потребляет много ресурсов даром.

...