Как выполнить множественный запрос из списка и получить ответ для каждого из них, используя rx - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть список MeasurementValue. Я хочу выполнить API-вызов AWS для каждого из них, чтобы создать новое MeasurementValue в AWS. Если он был успешно создан в AWS, я получу идентификатор для этого. Мне нужно установить восстановленный идентификатор как valueId и сохранить его локально в базе данных комнаты. Когда все выполнение вызова выполнено, я могу сделать некоторые другие вещи, основанные на моем требовании. Но я получаю только последний элемент в подписке. Вот код в моей ViewModel.

        Observable.fromIterable(measurement.values)
            .doOnSubscribe { 
                //Show loader
            }
            .doAfterTerminate {
                //Close the loader
            }
            .flatMapSingle { value: MeasurementValue ->
                measurementValueRepository.saveMeasurementValueInAWS(value)
            }
            .subscribe({ measurementValue ->
                measurementValueRepository.saveMeasurementValue(measurementValue)
                isDataSaved.postValue(true)
            }, { throwable ->
                throwable.printStackTrace()
            })

В репозитории

override fun saveMeasurementValueInAWS(measurementValue: MeasurementValue): SingleSource<MeasurementValue> {

        return measurementValueAwsSource.createMeasurementValueInAWS(measurementValue)


    }

Код для вызова AWS.

override fun createMeasurementValueInAWS(measurementValue: MeasurementValue): Single<MeasurementValue> {
        return Single.create { emitter ->
            var createMeasurementValueInput = CreateMeasurementValueInput.builder()
            createMeasurementValueInput.measurementValueMeasurementId(measurementValue.measurementId)
            createMeasurementValueInput.unit(measurementValue.unit)
            createMeasurementValueInput.value(measurementValue.value)

            var createMeasurementValueMutation = CreateMeasurementValueMutation.builder().input(createMeasurementValueInput.build()).build()

            val mutationCallback = object : GraphQLCall.Callback<CreateMeasurementValueMutation.Data>() {
                override fun onResponse(response: Response<CreateMeasurementValueMutation.Data>) {
                    var id = response.data()?.createMeasurementValue()?.id()
                    id?.let {generatedId ->
                        measurementValue.valueId = generatedId
                        emitter.onSuccess(measurementValue)
                    }
                }
                override fun onFailure(e: ApolloException) {
                    emitter.onError(e)
                }
            }
            awsAppSyncClient.mutate(createMeasurementValueMutation).enqueue(mutationCallback)
        }
    }
...