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)
因为... 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)
}