В ГлавнаяРепозиторийImpl есть функция getWorldWideData, которая возвращает AnyPublisher<WorldwideResponseItem, ErrorType>.
func getWorldwideData() -> AnyPublisher<WorldwideResponseItem, ErrorType> {
let url = RestEndpoints.worldwideStats.endpoint()
let publisher: AnyPublisher<WorldwideResponseItem, ErrorType> = RestManager().fetchData(url: url)
return publisher
.flatMap {
let filteredCountries = Array($0.countries.sorted(by: {$0.totalConfirmed > $1.totalConfirmed}).prefix(3))
$0.countries = filteredCountries
return Just($0)
}
}
FlatMap берет WorldResponseItem от издателя, а WorldResponseItem имеет свойство массива страны, которое я хотел отсортировать, поэтому я создал новую переменную с именем отфильтрованныеСтраны и изменил ее значение на массив с 3 отсортированными странами, и я изменил свойство стран WorldResponseItem на отфильтрованныеСтраны, и flatMap возвращает только с WorldResponseItem от издателя.
Но я получаю ошибку Ни один из кандидатов «flatMap» не дает ожидаемого контекстуального типа результата «AnyPublisher<WorldwideResponseItem, ErrorType>», и когда я добавляю .eraseToAnyPublisher() в конвейер, я получаю Тип выражения неоднозначен без дополнительного контекста
В вашем flatMap
есть несколько проблем. Вам нужно вызвать setFailureType
и eraseToAnyPublisher
на Just
внутри flatMap
, а затем также вызвать eraseToAnyPublisher
на самом flatMap
.
Вы также должны использовать именованные аргументы замыкания при работе с вложенными замыканиями — у вас есть sorted(by:)
, вложенный внутрь flatMap
.
func getWorldwideData() -> AnyPublisher<WorldwideResponseItem, ErrorType> {
let url = RestEndpoints.worldwideStats.endpoint()
let publisher: AnyPublisher<WorldwideResponseItem, ErrorType> = RestManager().fetchData(url: url)
return publisher
.flatMap { response -> AnyPublisher<WorldwideResponseItem, ErrorType> in
let filteredCountries = Array(response.countries.sorted(by: { $0.totalConfirmed > $1.totalConfirmed }).prefix(3))
response.countries = filteredCountries
return Just(response).setFailureType(to: ErrorType.self).eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
Тем не менее, вы не должны использовать flatMap
в первую очередь. Вы просто сопоставляете вывод с другим значением, поэтому вы можете просто использовать map
, что значительно упрощает закрытие.
func getWorldwideData() -> AnyPublisher<WorldwideResponseItem, ErrorType> {
let url = RestEndpoints.worldwideStats.endpoint()
let publisher: AnyPublisher<WorldwideResponseItem, ErrorType> = RestManager().fetchData(url: url)
return publisher
.map { response -> WorldwideResponseItem in
let filteredCountries = Array(response.countries.sorted(by: { $0.totalConfirmed > $1.totalConfirmed }).prefix(3))
response.countries = filteredCountries
return response
}
.eraseToAnyPublisher()
}