我的問題是 - 我正在構建同時顯示 20 個不同城市的天氣應用程式(這就是任務)。當我把它放在守衛讓url = URL(字串 :)像這樣(倫敦)時,我可以用一個城市做到這一點
struct Constants {
static let API_KEY = "<api-key>"
static let baseURL = "https://api.openweathermap.org/data/2.5/weather?appid=\(API_KEY)&units=metric&q=" // cityName
}
class APICaller {
static let shared = APICaller()
func getData(completion: @escaping(Result<[WeatherDataModel], Error>) -> Void) {
guard let url = URL(string: "\(Constants.baseURL)London") else { return } // Here is the city i've put
let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
guard let data = data, error == nil else {
return
}
do {
let results = try JSONDecoder().decode(MainWeatherDataModel.self, from: data)
completion(.success(results.results))
} catch {
completion(.failure(error))
}
}
task.resume()
}
}
我的專案在 TableView 中包含 CollectionView。決議資料填充 Cells 但它只是一個城市顯示在 App 中。我還需要19個。所以我的問題是:如何在 URL 中實作不同的查詢,或者是否有一種方法可以進行多次決議?
謝謝
uj5u.com熱心網友回復:
這是一個非常基本的示例代碼,用于使用修改后的設定獲取多個城市的天氣。它顯示了如何根據問題使用 URL 實作不同的查詢。
請注意,您應該閱讀(并使用)Swift async/await 并發,以同時獲取所有資料。
struct Constants {
static let API_KEY = "api-key"
static let baseURL = "https://api.openweathermap.org/data/2.5/weather?appid=\(API_KEY)&units=metric&q="
}
class APICaller {
static let shared = APICaller()
// -- here
func getData(cityName: String, completion: @escaping(Result<[WeatherDataModel], Error>) -> Void) {
// -- here
guard let url = URL(string: (Constants.baseURL cityName)) else { return }
URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
guard let data = data, error == nil else { return }
do {
let results = try JSONDecoder().decode(MainWeatherDataModel.self, from: data)
// -- here
if let weather = results.weather {
completion(.success(weather))
} else {
completion(.success([]))
}
} catch {
completion(.failure(error))
}
}.resume()
}
}
struct ContentView: View {
@State var citiesWeather: [String : [WeatherDataModel]] = [String : [WeatherDataModel]]()
@State var cities = ["London", "Tokyo", "Sydney"]
var body: some View {
List(cities, id: \.self) { city in
VStack {
Text(city).foregroundColor(.blue)
Text(citiesWeather[city]?.first?.description ?? "no data")
}
}
.onAppear {
for city in cities {
fetchWeatherFor(city) // <-- no concurrency, not good
}
}
}
func fetchWeatherFor(_ name: String) {
APICaller.shared.getData(cityName: name) { result in
switch result {
case .success(let arr): citiesWeather[name] = arr
case .failure(let error): print(error) // <-- todo
}
}
}
}
struct WeatherDataModel: Identifiable, Decodable {
public let id: Int
public let main, description, icon: String
}
struct MainWeatherDataModel: Identifiable, Decodable {
let id: Int
let weather: [WeatherDataModel]?
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/512178.html
上一篇:iPhone和iPad上的輸入欄位為空白且無文本輸入
下一篇:在bash中決議sdf檔案
