簡體   English   中英

Swift:解析JSON字典值

[英]Swift: Parsing JSON Dictionary Values

我正在嘗試解析JSON數據。 我能做的是將JSON數據保存為NSData文件。 然后我可以將其作為NSDictionary讀取並為相應的文本字段設置一些值。 我不能做的是將JSON中的值直接放到相應的文本字段中。 數據來源是開放天氣圖。 這對我來說並不重要。 我只需要數據來練習JSON解析。 無論如何,以下就是我所擁有的。

@IBOutlet weak var coordField1: UITextField!
@IBOutlet weak var countryField1: UITextField!
@IBOutlet weak var ideeField1: UITextField!
@IBOutlet weak var nameField1: UITextField!
@IBOutlet weak var cntField1: UITextField!
@IBOutlet weak var codField1: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    enum JSONError: String, ErrorType {
        case NoData = "ERROR: no data"
        case ConversionFailed = "ERROR: conversion from JSON failed"
    }

    let urlPath = "http://api.openweathermap.org/data/2.5/forecast/city?id=524901&APPID=fb1b5dcb756e9a52c49ee6377a02d879"
    guard let endpoint = NSURL(string: urlPath) else { print("Error creating endpoint");return }
    let request = NSMutableURLRequest(URL:endpoint)
    NSURLSession.sharedSession().dataTaskWithRequest(request) { (data,response,error) -> Void in
        do {
            guard let dat = data else { throw JSONError.NoData }
            guard let jsonDict = try NSJSONSerialization.JSONObjectWithData(dat,options:[]) as? NSDictionary else { throw JSONError.ConversionFailed }
            //print(json)

            if let items1 = jsonDict["city"] as? NSDictionary {
                if let a = items1["coord"] {
                    if let lat = a["lat"] as? NSNumber {
                        print("\(lat.stringValue)") // It prints "55.75222"
                        self.coordField1.text = "lat: " + lat.stringValue as String + " "
                    }
                    if let lon = a["lon"] as? NSNumber {
                        print("\(lon.stringValue)") // √
                        self.coordField1.text = self.coordField1.text! + "lon: " + lon.stringValue as String
                    }
                }
            }

            let jdata:NSData = NSKeyedArchiver.archivedDataWithRootObject(jsonDict)
            jdata.writeToFile(self.filePath1(), atomically:true) // saving JSON as an NSData file

        } catch let error as JSONError {
            print(error.rawValue)
        } catch {
            print(error)
        }
        }.resume()
    }       
}

Xcode迫使我在每個文本字段之前放置自己。 我可以想象為什么。 無論如何,因此,我有空文本字段。 應用程序不會崩潰。 我究竟做錯了什么?

謝謝。

@ J.Wang指出了正確的事情。 問題是UI沒有在主線程上更新。 正如文檔所述,將在委托隊列上執行completionHandler因此我們必須使用主隊列進行調度。 順便說一句,我也警告說這個應用程序試圖在后台線程上修改autolayout ...

dispatch_async(dispatch_get_main_queue(), { () -> Void in
   self.coordField1.text = "lat: " + lat.stringValue as String + " "
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM