Я новичок в реактивном программировании и Combine, у меня есть следующий метод, который извлекает данные о погоде из API.
- Во-первых, я проверяю, что если я получаю 200, если нет, то выдает ошибку.
- Если я получаю правильные данные, я декодирую их с помощью JSONDecoder, но просто чтобы проверить, есть ли какие-то проблемы с декодированием JSON, я возвращаю объект по умолчанию.
- Наконец, сопоставление ошибки, которая возникает на первом шаге, но я получаю следующую ошибку в методе экземпляра функции flatMAp
flatMap (maxPublishers: _ :) »требует, чтобы типы Publishers.TryMap.Failure (также известные как« Ошибка ») и« Just.Failure »(также известные как« Никогда ») были эквивалентными
private func fetchDataFor(urlStr: String) -> AnyPublisher<WeatherData, Error> {
let url = URL(string: urlStr)!
return URLSession.shared.dataTaskPublisher(for: url)
.tryMap({ (data, response) in
let response = (response as? HTTPURLResponse)
if response?.statusCode != 200 {
throw NSError(domain: "Error", code: response!.statusCode, userInfo: .none)
}
return data
})
.flatMap{ data in
Just(data)
.decode(type: WeatherData.self, decoder: JSONDecoder())
.catch{ error in
return Just(defaultWeatherData)
}
}
.mapError{ error in
return error
}
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
}
Может ли кто-нибудь указать, что здесь не так, или я использую какой-то неправильный подход. Спасибо