迅捷组合平面图顺序操作

问题描述 投票:0回答:1
extension CLGeocoder {
    func reverseGeocodeLocationPublisher(_ location: CLLocation, preferredLocale locale: Locale? = nil) -> AnyPublisher<CLPlacemark, Error> {
        Future<CLPlacemark, Error> { promise in
            self.reverseGeocodeLocation(location, preferredLocale: locale) { placemarks, error in
                guard let placemark = placemarks?.first else {
                    return promise(.failure(error ?? CLError(.geocodeFoundNoResult)))
                }
                return promise(.success(placemark))
            }
        }.eraseToAnyPublisher()
    }
}

$stations.flatMap(maxPublishers: .max(1)) { (station) -> AnyPublisher<CLPlacemark, Error> in
            let location = CLLocation(latitude: station.latitude, longitude: station.longitude)
            self.geocoder.reverseGeocodeLocationPublisher(location)

        }.eraseToAnyPublisher().sink(receiveCompletion: { completion in
            print("done")
        }, receiveValue: { placemark in
            print("placemark:", placemark)
        }).store(in: &cancellableSet)

错误。Instance method 'flatMap(maxPublishers:_:)' requires the types 'Published<[Station]>.Publisher.Failure' (aka 'Never') and 'Error' be equivalent

我想实现的是,我有一个站的列表,其中包含: location 而我想 reverseGeocodeLocation 依次

swift combine flatmap
1个回答
0
投票

你看到的错误是由于 Publishers.FlatMap 这就要求 Failure 的上游和新的发布者是相同的。FlatMap 返回一个 FailureError 型,但 $stations 拥有 FailureNever,所以你需要用调整。

.setFailureType(to: Error.self)

因为... stations 是一个数组,而你想按顺序处理每个元素,你需要用一个 Publishers.Sequence 出版商(可通过 Array.publisher),会将每个元素逐一发出。

stations.publisher

把这两个东西放在一起:

$stations.flatMap { stations in
            stations.publisher
         }
         .setFailureType(to: Error.self)
         .flatMap { station in 
            let location = CLLocation(latitude: station.latitude, ...)
            return self.geocoder.reverseGeocodeLocationPublisher(location)
         }
© www.soinside.com 2019 - 2024. All rights reserved.