Как связать несколько вызовов API с помощью dataTaskPublisher?

Я хочу получить данные из REST API, и для этого мне нужно сначала получить массив идентификаторов - первый вызов. После этого мне нужно сделать вызов API, используя каждый идентификатор. Я не хочу использовать завершение, а объединение. Я начал с dataTaskPublishers, но я не уверен, как их связать для правильной работы

Вот мой код до сих пор:

   private func getIDs(for type: DataType) -> AnyPublisher<[ID], Error> {
        guard let url = URL(string: "url")
            else { fatalError("Wrong URL") }

        return session.dataTaskPublisher(for: url)
            .receive(on: RunLoop.main)
            .map { $0.data }
            .decode(type: [ID].self, decoder: decoder)
            .eraseToAnyPublisher()
    }

    private func getData(with id: ID) -> AnyPublisher<MyData, Error> {
        guard let url = URL(string: "url_with_id")
            else { fatalError("Wrong URL") }
        return session.dataTaskPublisher(for: url)
            .receive(on: RunLoop.main)
            .map { $0.data }
            .decode(type: MyData.self, decoder: decoder)
            .eraseToAnyPublisher()
    }

Я не совсем уверен, как я могу соединить их, чтобы получить что-то, что можно назначить для моей переменной состояния - массив MyData.

1 ответ

Решение

Как предлагается в /questions/50424694/swift-combine-kak-sozdat-odnogo-izdatelya-iz-spiska-izdatelej/50424700#50424700, вы можете использовать collect():

func getAllData() -> AnyPublisher<[MyData], Error> {
    getIDs().flatMap { ids -> AnyPublisher<[MyData], Error> in
        let publishers = ids.map { self.getData(with: $0) }
        return Publishers.Sequence<[AnyPublisher<MyData, Error>], Error>(sequence: publishers)
            .flatMap { $0 }
            .collect()
            .eraseToAnyPublisher()
    }.eraseToAnyPublisher()
}
Другие вопросы по тегам