Функция расширения Kotlin при подписке на текущие данные RxJava - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу написать функцию, которая автоматически подпишется на Flowable<T> RxJava и получит полученные данные.Эти данные затем будут переданы в качестве аргумента другому методу, который выполняет обработку.Я борюсь с синтаксисом и обобщением функции расширения Kotlin.

Я хочу преобразовать этот вызов:

    val scheduler = Schedulers.newThread()
    disposable.add(
        viewModel.getExams().subscribeOn(scheduler)
            .observeOn(scheduler)
            .subscribe({ exams ->
                exams.forEach { 
                    getSubjectOfExam(it, Schedulers.newThread())
                }
            }, { error ->
                Log.e(
                    "OverviewFragment",
                    "Unable to fetch list, $error"
                )
            })
    )

, который очень длинный в моем коде Activity, в метод, который возвращаетданные, которые я хочу обработать.

В этом случае я бы хотел, чтобы список экзаменов (List<Exam>) передавался в аргумент getSubjectOfExam(), который является методом обработки списка.

Моя функция на данный момент, которая компилируется, но не работает вообще:

/**
 * General subscription of items in a Flowable list
 * @param f method to be executed when list is loaded
 * @param scheduler scheduling units
 */
private fun Flowable<out List<Any>>.listSubscribe(
    f: (List<Any>) -> Unit,
    scheduler: Scheduler
) {
    disposable.add(
        this.subscribeOn(scheduler)
            .observeOn(scheduler)
            .subscribe({
                f(it)
            }, { error ->
                Log.e(
                    "OverviewFragment",
                    "Unable to fetch list, $error"
                )
            })
    )
}

она будет называться так:

    viewModel.getExams().listSubscribe({ resultData ->
        resultData.forEach {
            val exam = it as Exam
            getSubjectOfExam(exam, Schedulers.newThread())
        }
    }, Schedulers.newThread())

Так что да, я попытался сделатьрасширение функции и передача функции в качестве одного из ее аргументов (я считаю, что она называется функцией более высокого порядка).

С моим методом getSubjectOfExam вообще не вызывается.Есть ли что-то, чего мне не хватает?

Я буду подписываться на Flowable все время в своей Активности, поэтому эта функция действительно поможет мне.

1 Ответ

0 голосов
/ 02 февраля 2019

Я попробовал ваш код, и кажется, что он работает нормально.Есть ли вероятность, что viewModel.getExams() или getSubjectOfExam() не работает?

Также я могу предложить несколько вариантов оптимизации:

protected fun <T> Flowable<out List<T>>.listSubscribe(
    f: (List<T>) -> Unit,
    scheduler: Scheduler
) {
    disposable.add(
        this.subscribeOn(scheduler)
            .observeOn(scheduler)
            .subscribe(f, { error ->
                Log.e(
                    "OverviewFragment",
                    "Unable to fetch list, $error"
                )
            })
    )
}

Тогда вам не понадобится преобразование типов:

viewModel.getExams().listSubscribe({ resultData ->
    resultData.forEach {
        getSubjectOfExam(exam, Schedulers.newThread())
    }
}, Schedulers.newThread())

Фактически вы можете заменить List<T> просто T и заставить его работать с любыми типами.Кроме того, наблюдение и подписка на один и тот же планировщик не имеют большого смысла для меня.Я думаю, что вы можете полностью удалить .observeOn, и код все равно будет наблюдаться в том же планировщике, который вы вставили в .subscribeOn

...