合并中的连锁请求

问题描述 投票:0回答:1

我正在努力结合两个请求。我需要第一个id,然后从接收到的列表中的第一个id开始第二个。我找不到通过Swift Combine做到这一点的不错的解决方案。

我的第一个请求看起来像是CarSerview.shared.getCategories() -> AnyPublisher<[Category], CarError>

 private func getCategories() {
    CarSerview.shared.getCategories()
        .receive(on: DispatchQueue.main)
        .map { car in
           return car.id
        }
        .replaceError(with: [])
        .assign(to: \.carsIds, on: self)
        .store(in: &cancellable)
}

第二个看起来像CarSerview.shared.getCar() -> AnyPublisher<Car, CarError>

private func getCar(_ category: CategoryObject) {
    SPService.shared.getExcursions(category)
        .receive(on: DispatchQueue.main)
        .map { car in
            return car.cars.compactMap { $0.name }
        }
    .sink(receiveCompletion: { error in
        print(error)
    }, receiveValue: { [weak self] result in
        self?.cars = result
    })
}

如何将这两个请求合而为一?

swift swiftui publish-subscribe combine
1个回答
0
投票

无法测试,但想法是使用.map + .switchToLatest,因此可以如下所示

private func getCars() {
    CarSerview.shared.getCategories()
        .receive(on: DispatchQueue.main)
        .map { car in
            return SPService.shared.getExcursions(car.id)
    }
    .switchToLatest()
    .map { car in
         return car.cars.compactMap { $0.name }
    }
    .sink(receiveCompletion: { error in
        print(error)
    }, receiveValue: { [weak self] result in
        self?.cars = result
    })
}
© www.soinside.com 2019 - 2024. All rights reserved.