【问题标题】:How to chain multiple API calls using dataTaskPublisher?如何使用 dataTaskPublisher 链接多个 API 调用?
【发布时间】:2019-08-12 02:33:48
【问题描述】:

我想从 REST API 获取数据,为此,我需要首先获取一个 ID 数组 - 第一次调用。之后,我需要使用每个 ID 进行 API 调用。我不想使用completionHandlers,而是使用Combine。我从 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 数组。

【问题讨论】:

  • 其实我认为使用zip 是最简单的,除非我误解了这个问题。

标签: ios swift swiftui combine


【解决方案1】:

按照https://stackoverflow.com/a/56786412/1271826的建议,您可以使用collect()

func getAllData(for type: DataType) -> AnyPublisher<[MyData], Error> {
    getIDs(for: type).flatMap { ids in
        Publishers.Sequence(sequence: ids.map { self.getData(with: $0) })
            .flatMap { $0 }
            .collect()
    }.eraseToAnyPublisher()
}

【讨论】:

  • 为什么不在flatMap 块中使用return Publishers.MergeMany(publishers).eraseToAnyPublisher()
猜你喜欢
  • 2020-12-25
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多