Условная задержка перед выпуском Single - PullRequest
0 голосов
/ 02 июля 2018

Конечная точка API RESTful возвращает ответ JSON. Ответ JSON состоит из 20 различных элементов JSON-Array. Каждый элемент имеет URL-адрес изображения.

После получения первого ответа я намереваюсь пройти через JSON-Array и извлечь изображения, используя Retrofit Dynamic URLs.

class Content { var items List<Item>? = null }

class Item { var image: String? = null 
    var imageBytes: ByteArray? = null
}

interface RestApi { @GET fun getContent(): Single<Content>
@GET fun getImageBytes(@Url url: String): Single<ResponseBody>
}

restApi.getContent()
    .map { content: Content -> {
        content.items?.forEach { item ->
            restApi.getImageBytes(item.image)
                .subscribe(object : DisposableSingleObserver<ResponseBody>() {
                    onSuccess(body: ResponseBody) {
                        item.imageBytes = body.getBytes()
                    }
                    onError(e: Throwable) { // TODO Implementation }
                })
            }
        }
    }

Как сделать задержку метода getContent () перед отправкой до тех пор, пока все вызовы getImageBytes () также не завершатся успешно или с ошибкой?

1 Ответ

0 голосов
/ 02 июля 2018

С Single вы должны использовать flatten observable, он выдаст список наблюдаемых, которые примет плоская карта

 getListOfItems()
                .flattenAsObservable(new Function<Object, Iterable<?>>() {
                    @Override
                    public Iterable<?> apply(@NonNull Object o) throws Exception {
                        return toItems(o);
                    }
                })
                .flatMap(item -> doSomethingWithItem())
                .toList()
...