2016-04-04 4 views
3

JSONデータを解析しようとしています。私ができることはJSONデータをNSDataファイルとして保存することです。それから私はNSDictionaryとしてそれを読むことができ、それぞれのテキストフィールドにいくつかの値を設定します。私ができないことは、JSONの値をそれぞれのテキストフィールドに直接配置することです。データのソースはOpen Weather Mapです。それは私のためにはあまり重要ではありません。 JSON解析を実行するためのデータが必要です。とにかく、以下は私が持っているものです。Swift: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は、各テキストフィールドの前に自分自身を置くことを余儀なくされました。私は理由をイメージすることができます。とにかく、空のテキストフィールドがあります。アプリケーションがクラッシュすることはありません。私は間違って何をしていますか?

ありがとうございました。

+0

実際にコードがテキストを設定していることを確認しましたか?もし成功すれば成功し、実際には値はフィールドに設定されていますか? – Shripada

+0

Que !?私の質問はなぜ私のテキストフィールドに値が設定されていないのですか? –

+0

私はそれを理解しています。私の質問は、その中に印刷することができますあなたのテキスト設定コードが存在するステートメントは、制御がそこに来ることを確認する場合は?とにかく文字列が必要なので、NSNumberへの型キャストは不要です。 – Shripada

答えて

2

@ J.Wangは正しいことを指摘しています。問題は、メインスレッドでUIが更新されていないことです。 docsが示すように、completionHandlerはデリゲートキューで実行されるため、メインキューにディスパッチする必要があります。ところで、私はこのアプリケーションがバックグラウンドスレッドで自動レイアウトを変更しようとしていることも警告しています...

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