Как вернуть Observable от подписки или карты? - PullRequest
0 голосов
/ 05 мая 2019

Я хочу вернуть Observable в функцию Subscribe, но я прочитал документ, что это невозможно. Поэтому я попытался сделать это с помощью функции карты. Однако это породило ошибку.

Это код:

interface DataSource {

    fun getItem() : Observable<List<RetroCrypto>>
}

//

object RemoteDataSource : DataSource {

private val myCompositeDisposable by lazy { CompositeDisposable() }

override fun getItem() : Observable<List<RetroCrypto>> {

    val retrofit = RetroClient.getRetrofit()
    val requestInterface = retrofit.create(GetData::class.java)

    myCompositeDisposable.add(requestInterface.getData()
        // Send the Observable’s notifications to the main UI thread
        .observeOn(AndroidSchedulers.mainThread())
        // Subscribe to the Observer away from the main UI thread
        .subscribeOn(Schedulers.io())
        .map { return it }

    )
}

}

getRetrofit - это метод создания экземпляра модификации.

Я не знаю, почему приведенный выше код генерирует ошибку.

Ошибка

1. Return is not allowed here

2. Type mismatch. Required : Observable<List<RetroCrypto>> , Found : List<RetroCrypto>

Как я могу исправить код?

1 Ответ

0 голосов
/ 05 мая 2019

Внутри map лямбды вы получаете элемент внутри Observable, поэтому в вашем случае it выглядит как List<RetroCrypto>.Если вы хотите вернуть Observable, вы должны сделать что-то вроде этого:

object RemoteDataSource : DataSource {

    private val myCompositeDisposable by lazy { CompositeDisposable() }

    override fun getItem(): Observable<List<RetroCrypto>> {

        val retrofit = RetroClient.getRetrofit()
        val requestInterface = retrofit.create(GetData::class.java)

        val observable = requestInterface.getData()
                // Send the Observable’s notifications to the main UI thread
                .observeOn(AndroidSchedulers.mainThread())
                // Subscribe to the Observer away from the main UI thread
                .subscribeOn(Schedulers.io())

        return observable
    }
}

Примечание: вы получаете одноразовое изделие, которое можно добавить к myCompositeDisposable только после подписки, так что вам придется делать myCompositeDisposable.add вне этой функции.

...