Я использую Rx Java с модернизацией, чтобы выполнять сетевые вызовы. В моем коде у меня есть вызов дооснащения, который возвращает Single<Result<List<SpoonacularResult>>>
. У меня есть другая функция, которая вызывает функцию модернизации и использует карту для преобразования ее в Kotlin .Результат. Другая функция принимает Kotlin .Результат и заменяет его на другой Kotlin .Результат, чтобы мой пользовательский интерфейс мог получать результаты и делать что угодно. Проблема, с которой я сталкиваюсь, заключается в том, что после того, как getRecipesViewModel вызывает getRecipes, тип processingResult равен Single<Result<Result<List<SpoonacularResult>>>
. Это происходит только тогда, когда мой getRecipesRetrofit возвращает ошибку, он работает совершенно нормально, когда возвращает успех. Я не уверен, откуда берется дополнительный Результат, заключающий в себе внутренний Результат. Ниже приведен мой код и несколько рисунков, чтобы проиллюстрировать то, о чем я говорю, поскольку ошибка немного странна для объяснения.
тип returnResult из getRecipes
processingResult от getRecipesViewModel
@GET("recipes/findByIngredients?number=50&ranking=2")
fun getRecipesRetrofit(@Query("ingredients", encoded = true) ingredients: String, @Query("apiKey") apiKey: String)
: Single<RxResult<List<SpoonacularResult>>>
fun getRecipes(ingredients: String): Single<KtResult<List<SpoonacularResult>>> {
return spoonService.getRecipesRetrofit(ingredients, "ApiKey").map { result ->
val processedResult = responseProcessor.process(result)
val returnResult = if (processedResult.isFailure()) {
KtResult.failure(processedResult.error!!)
} else {
KtResult.success(processedResult.body!!)
}
returnResult
}
}
fun getRecipesViewModel(set: MutableSet<String>): Single<Result<Int>> {
val ingredients = setUpSet(set)
return service.getRecipes(ingredients).map { processedResult ->
val networkResult = if (processedResult.isFailure) {
val error = processedResult.exceptionOrNull()!!
Result.failure(error)
} else {
val resultBody = processedResult.getOrNull()!!
if (resultBody.isNotEmpty()) {
CoroutineScope(Dispatchers.IO).launch {
recipeDao.clearRecipes()
resultBody.forEach {
recipeDao.insertRecipe(it)
}
}
Result.success(1)
} else {
Result.success(2)
}
}
networkResult
}
}