Как извлечь значение из JSON объекта с помощью словаря [Swift 4] - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь сделать asyn c API получить запрос к openweathermap.org API. Результат должен быть такой 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()

1 Ответ

0 голосов
/ 18 апреля 2020

Во-первых, 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...