ios - 无法从 Dark Sky API 获取数据

标签 ios json swift api

我尝试从 Dark Sky API 获取有关每小时天气的信息,但代码在 if let data = hourly["data"] as? [String : AnyObject] 行(在每行之后检查打印内容)。我想知道我的代码有什么问题。我认为这可能与“数据”有关,但我不确定。

 let Task2 = URLSession.shared.dataTask(with: urlRequestDark) { (data, response, error) in
        if error == nil {
            do {
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : AnyObject]

                if let hourly = json["hourly"] as? [String : AnyObject] {
                    if let data = hourly["data"] as? [String : AnyObject]{


                        if let hourNum = data["14"] as? [String : AnyObject] {
                            if let chanceRain = hourNum["precipProbability"] as? Float{
                                self.chanceHour1 = String(chanceRain)
                            }
                            DispatchQueue.main.sync {
                                self.ChanceRainLabel.text = self.chanceHour1
                            }
                        }
                    }

                }

            } catch let jsonError {
                print(jsonError.localizedDescription)
            }
        }
    }
    Task2.resume() test

奇怪的是,这确实有效:

let urlRequestDark = URLRequest(url: URL (string: "https://api.darksky.net/forecast/(API Key)/(coordinates)")!)

    let Task = URLSession.shared.dataTask(with: urlRequestDark) { (data, response, error) in
        if error == nil {
            do{
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : AnyObject]


                if let currently = json["currently"] as? [String : AnyObject] {

                    if let chance2 = currently["precipProbability"] as? Float{
                        print(String(chance2))
                        self.chance = String(Int(chance2 * 100)) + "%"
                        self.PreType = currently["precipType"] as? String
                    }

                        if let _ = json["error"]{
                    }

                    DispatchQueue.main.sync{
                        self.TypeLabel.text = self.PreType
                        self.ChanceLabel.text = self.chance
                    }
                }


            }catch let jsonError{
                print(jsonError.localizedDescription)
            }
        }
    }
    Task.resume()

最佳答案

你犯了几个错误。

首先,"data" 是一个字典数组,所以它应该被转换为 [[String : AnyObject]]。

其次,您正在尝试通过 String 而不是 Int 为数组下标。

第三,在转义闭包中使用 self 可能会产生保留循环。

让我向您推荐一些固定和调整后的代码。

let task2 = URLSession.shared.dataTask(with: urlRequestDark) { [weak self] (data, response, error) in
    guard error == nil else { return }
    do {
        if let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String : AnyObject],
            let hourly = json["hourly"] as? [String : AnyObject],
            let data = hourly["data"] as? [[String : AnyObject]],
            data.count > 14,
            let chanceRain = data[14]["precipProbability"] as? Float {
                self?.chanceHour1 = String(chanceRain)
                DispatchQueue.main.sync {
                    self?.ChanceRainLabel.text = self?.chanceHour1
                }
        }
    } catch let jsonError {
        print(jsonError.localizedDescription)
    }
}
task2.resume()

关于ios - 无法从 Dark Sky API 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805421/

相关文章:

Python从函数调用中的args的嵌套字典中提取值

json - Steam Web API : How Can I Get list of all items for game ids(570, 44​​0, 730, 753) 带标签和描述

swift - swift 中 awakeFromNib() 和 viewDidLoad() 之间的区别

ios - Sprite 套件中的 SKShapeNode 碰撞检测未检测到碰撞

ios - 下拉刷新功能不起作用

json - 如何在 C++ 中使用 Boost 访问嵌套的 json 数组元素

ios - iOS 的 IAP 收据验证

ios - 按下按钮时应用程序卡住

ios - UIViewController 转换使用 MVVM+Coordinators 模式

objective-c - iOS 视网膜屏幕的着色器优化