あなたはgetWeather
が行われた後に何かをしたい場合は、完了ハンドラを追加します。個人的に、Iキャプチャされた情報をバック渡す構造を作成することによって、これを簡略化したい:
struct WeatherReport {
let latitude: Double
let longitude: Double
let temperature: Double
let name: String
let desc: String
}
func getWeather(city: String, completion: @escaping (WeatherReport?, Error?) -> Void) {
...
let task = session.dataTask(with: url!) { data, _, error in
...
guard successful else {
completion(nil, error)
return
}
let weatherReport = WeatherReport(...)
completion(weatherReport, nil)
}
task.resume()
}
そして
override func viewDidLoad() {
super.viewDidLoad()
getWeather(city: "Minsk") { weatherReport, error in
guard let weatherReport = weatherReport, error == nil else {
print(error?.localizedDescription ?? "Unknown error")
return
}
DispatchQueue.main.async {
// do something with `weatherReport` here
}
}
}
注、dataTask
は既に(a)は、非同期的に実行されます。および(b)は上図のようなので、viewDidLoad
は、明示的にモデルオブジェクトおよび/またはgetWeather
完了ハンドラでメインキューにUIでない何かを派遣する必要があり、バックグラウンドスレッドでその完了ハンドラを実行します。ところで
あなたはスウィフト4を使用している場合、私はその第三者JSONの構文解析ライブラリを排除し、JSONDecoder
を使用することをお勧めしてDecodable
あるモデル構造、例えばしたい:
struct Coordinate: Decodable {
let latitude: Double
let longitude: Double
enum CodingKeys: String, CodingKey {
case latitude = "lat"
case longitude = "lon"
}
}
struct WeatherReportDetails: Decodable {
let temperature: Double
let pressure: Double
let humidity: Double
let temperatureMin: Double
let temperatureMax: Double
enum CodingKeys: String, CodingKey {
case pressure, humidity
case temperature = "temp"
case temperatureMin = "temp_min"
case temperatureMax = "temp_max"
}
}
struct WeatherReport: Decodable {
let coordinate: Coordinate
let details: WeatherReportDetails
let name: String
enum CodingKeys: String, CodingKey {
case name
case coordinate = "coord"
case details = "main"
}
}
そして
func getWeather(city: String, completion: @escaping (WeatherReport?, Error?) -> Void) {
let cityEscaped = city.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!
let urlString = "http://samples.openweathermap.org/data/2.5/weather?q=" + cityEscaped + "&appid=..." // appid removed for privacy’s sake
let url = URL(string: urlString)!
let task = URLSession.shared.dataTask(with: url) { data, _, error in
guard let data = data, error == nil else {
completion(nil, error)
return
}
do {
let weatherReport = try JSONDecoder().decode(WeatherReport.self, from: data)
completion(weatherReport, nil)
} catch {
completion(nil, error)
}
}
task.resume()
}
は、あなたの質問を翻訳... –
あなたがそれをダウンロードする最初の印刷結果にしたいですか? 「こんにちは」「緯度経度」の後に持ち込まする –
はどういう意味ですか? –