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
您看到的错误是由于Publishers.FlatMap
所致,它要求上游发布者和新发布者的Failure
相同。 FlatMap
返回Failure
类型的Error
,但是$stations
的Failure
为Never
,因此您需要使用以下方法进行调整:
.setFailureType(to: Error.self)