Я пытаюсь заставить асинхронный API получить запрос к API openweathermap.org. В результате должна получиться эта структура JSON. Я особенно пытаюсь измерить температуру. Меня научили работать с ним, завернув JSON в словарь. Дело в том, что я не знаю, что я могу использовать, чтобы указать объект «основной» (в JSON) и получить температуру. Мне нужно перебирать объект за объектом? Это мой код (примечание: не беспокоит ли меня, что мое приложение использует 50 МБ ОЗУ?)

let url = URL(string: stringURL)

    let myQ = DispatchQueue.init(label: "getCityDetails")
    myQ.async {

        let session = URLSession.shared
        let m = session.dataTask(with: url!, completionHandler: {(data, response, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }

            guard let httpResponse = response as? HTTPURLResponse,
                (200...299).contains(httpResponse.statusCode) else {
                    print("Error with the response, unexpected status code: \(String(describing: response))")
                    return
            }

            do {
                if let d = data{
                    let dictionaryObj =  try JSONSerialization.jsonObject(with: d, options: []) as! NSDictionary
                    print(dictionaryObj)
                }
            }catch{
                print(error.localizedDescription)
            }

        })
        m.resume()
0
user13346022 18 Апр 2020 в 12:08

2 ответа

Лучший ответ

Во-первых, URLSession по умолчанию работает в фоновом потоке, поэтому вам не нужно создавать очередь отправки (хотя вы не используете ее правильно). Второй пункт пытается использовать необязательные данные, чтобы не использовать try / catch. Наконец, вы можете попробовать использовать Swift 5 вместе с протоколом Codable, чтобы получить лучший код, простой и безопасный.

let url = URL(string: "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=439d4b804bc8187953eb36d2a8c26a02")!
URLSession.shared.dataTask(with: url, completionHandler: {(data, response, error) in
    if let error = error {
        print(error.localizedDescription)
        return
    }

    guard let httpResponse = response as? HTTPURLResponse,
        (200...299).contains(httpResponse.statusCode) else {
            print("Error with the response, unexpected status code: \(String(describing: response))")
            return
    }

    guard let data = data else {
        return
    }

    guard let dictionaryObj = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
        return
    }
    if let main = dictionaryObj["main"] as? [String: Any], let temperature = main["temp"] {
        DispatchQueue.main.async {
            print("Temperature: \(temperature)")
        }
    }
}).resume()
0
93sauu 18 Апр 2020 в 09:35