RxJava2.Выполнить запрос для каждого элемента в списке - PullRequest
0 голосов
/ 11 мая 2018

У меня есть список List<FileModel>

FileModel просто класс содержит id: Int

id - это идентификатор файла фотографии, который мне нужно получить и привести к Bitmap

У меня есть запрос:

fun getFile(fileId: Int): Single<ResponseBody>

Этот запрос возвращает ResponseBody, который мы можем преобразовать в Bitmap

И

fun generatePhoto(responseBody: ResponseBody): Single<Bitmap?>

Что яхочу создать функцию

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    // Execute getFile(...) for each item in the list
    // Cast getFile(...) result to Bitmap using generatePhoto(...)
    // Return a list of Bitmaps
}

Я пробовал что-то подобное, но это совершенно неправильно

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    return Observable.fromIterable(list)
        .flatMap { getFile(it.id) }
        // How to call generatePhoto(...) here?
}

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вы пробовали:

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    return Observable.fromIterable(list)
        .flatMapSingle { getFile(it.id) }
        .flatMapSingle { generatePhoto(it) }
}

0 голосов
/ 11 мая 2018

Вы можете сделать это следующим образом:

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    // Get an Observable of the list
    return Observable.fromIterable(list)
        // Get a Single<ResponseBody> for every FileModel
        .flatMapSingle { getFile(it.id) }
        // Get a Single<Bitmap> for every ResponseBody
        .flatMapSingle { file -> generatePhoto(file) }
        // Put everything back on a list
        .toList()
}

Таким образом, вы можете перебирать список flapMapping для своих нужд, а затем собирать его обратно в виде списка в конце.Оператор toList() - это просто удобство, которое объединяет элементы, испущенные ранее.

И для вызова этой функции достаточно перейти:

    getPhotos(list)
        .doOnSuccess { resultList ->
          Log.d("Rx", "doOnSuccess.resultList=[$resultList]")
        }
        .subscribe()

Кстати, если у вас есть RxKotlinв качестве зависимости вы можете получить Observable от List с функцией расширения, например: myList.toObservable()

0 голосов
/ 11 мая 2018

Observable.fromIterable (list) должен выдавать событие для каждого элемента в списке, что означает, что тип возвращаемого вами значения в getPhotos будет Flowable<Bitmap>, поскольку Flowable может возвращать более одного значения.

Я думаю, что вы на самом деле хотите:

fun getPhotos(list: List<FileModel>): Flowable<Bitmap> {
    return Observable.fromIterable(list)
        .map { getFile(it.id) }
        .map { generatePhoto(it) }
}

если вы хотите создать список растровых изображений, вы можете использовать один, как это

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    return Single.just(list)
        .map { it.map { getFile(it.id) } }
        .flatMap { 
            Single.just(it.map { generatePhoto(it) }) 
        }
}
...