как из метода subscribe вернуть observable значение в rxjava2?

101
15 марта 2021, 16:10

Идея такова: Вставляю список в БД, подписываюсь на вставку, при успешной вставке, возвращается список id вставленных элементов, по этому списку id прохожусь в цикле и получаю строки по id, записываю строки в массив. После этот массив хочу вывести в консоль.

Описание кода: При вызове метода insert из метода insertDatums(), хочу получить наблюдаемый список insertedDatas, т.к если просто получать список insertedDatas, он почему то пустой. Список insertedDatas не заполняется данными при запуске программы, но при отладке заполняется.. Как из метода subscribe вернуть заполненный список insertedDatas с типом Observable? Или есть другие решения?

    class InspectionsImpl(fragment: Fragment, contextForInspections: Context) : Inspections {
        var datum: Datum? = null
        val repository: AlfaKndRepository = ViewModelProviders.of(fragment).get(AlfaKndViewModel::class.java).repository
        var insertedDatas:  MutableList<Datum>? = null
    override fun insertDatums(): Observable<MutableList<Datum>> {
    //хочу, что бы метод insert вернул заполенный insertedDatas с типом Observable     
return insert(dataForInsert!!)
        }
     private fun insert(datasForInsert: List <Datum>): Observable <MutableList<Datum>> { 
         //вставляю список в БД
         Observable.fromCallable { repository.insertList(datasForInsert) } 
            .subscribeOn(Schedulers.io())  
            .flatMapIterable { it.map { it.toInt() } }.toList() 
            //получаю список id вставленных строк
            .subscribe({ 
                for (it in it.iterator()){
                     //получаю из БД элементы по id
                     repository.getById(it)
                        //хочу записать строки полученные по id в массив insertedDatas, при отладке все записывается, а если запустить код, то массив пуст, поэтому хочу вернуть insertedDatas, как Observable
                        .subscribe({insertedDatas!!.add(it)}, {Log.d(TAG, it.message)})
}
Answer 1

@ЮрийСПб спасибо, так и сделал, мыслил по другому, хотел через цикл, когда проще было через map:

private fun insert(datasForInsert: List<Datum>): Single<MutableList<Datum>> {
   return Observable.fromCallable { repository.insertList(datasForInsert) }
            .subscribeOn(Schedulers.io())
           //перебираем список
           .flatMapIterable {
                //элемент списка приобразовываем в Long
                it.map {
                    it.toInt()
                }
            }
            //объеденить выпущенные элементы из map в список
            .toList()
           .map {
               it.toMutableList()
           }
           .map {
               it.map {it ->
                   repository.getById(it)
               }
           }.map {
               it.toMutableList()
           }.flatMap {
               Single.just(it)
           }
}
READ ALSO
Ссылка на метод экземпляра

Ссылка на метод экземпляра

Не могу понять как это работает

119
Не получается достать jsonArray из json(null)

Не получается достать jsonArray из json(null)

Задача: достать все посты из открытой группы

103
Отладка исходных кодов .Net Framework в Visual Studio

Отладка исходных кодов .Net Framework в Visual Studio

Например, при разработке и в процессе отладке java кода в idea можно проваливаться во внутреннюю реализацию пакетов и классов JDKЕсть ли что-то...

101
Форма обратной связи лишь цифры на клавиатуре

Форма обратной связи лишь цифры на клавиатуре

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

123