Попробуйте сделать group.toList () но выглядит сомнительно.Но получил: разрешен только один подписчик!Как исправить код? - PullRequest
0 голосов
/ 20 марта 2019

Моя задача - загрузить элементы разных типов, затем отсортировать их по типам

и вернуть результаты пары:

type to items (for the type)  

перенос на объект:

data class MyProWrap(val type: ProType, val profiles: ArrayList<ProImpl>)

поэтому после groupBy () я пытаюсь получить список элементов через group.toList () , а затем извлечь через blockingGet ()

myкод:

proRepo.loadUser(prefSource.userId)
            .flatMap {
                Flowable.fromIterable(it)
            }
            .groupBy { it.typePro}

             .flatMap { group ->
                group.map {
                    group.key to group.toList() //<- try collect result to list
                }
            }
            .map { 
                   MyProWrap(
                             type = it.first!!, 
                             profiles = ArrayList(it.second.blockingGet()) //<- try extract result from Single via blocking get
                            ) 
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                result = it
                }
            }, {
                Timber.e("Fail to load profiles. ${it.message}")
            })

но получил ошибку:

java.lang.IllegalStateException: Only one subscriber allowed!

мой класс обёртки:

data class MyProWrap(val type: ProType, val profiles: ArrayList<ProItem>)  

  enum class ProType {
     FIRST_TYPE,
     SECOND_TYPE,
     THIRD_TYPE 
}

есть способ это исправить?

1 Ответ

0 голосов
/ 21 марта 2019

Некоторое время назад я уже нашел решение через collect () оператор через сообщение

proRepo.loadUser(prefSource.userId)
                .flatMap { Flowable.fromIterable(it) }
                .groupBy { it.typePro } // <- group by profile type
                .flatMap { group ->
                    group.collect({ ArrayList<ProItem>() }, { profiles, profile ->
                        profiles.add(profile) //<- get profiles of one type    
                    }).map { 
                           MyProWrap(type = group.key!!, profiles = it) //<- wrap result
                       }.toFlowable()
                }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                           result = it 
                          },{ 
                            Timber.e("Fail to load profiles. ${it.message}") 
                          })
...