2016-04-21 83 views
0

追加JSON文件我使用:https://api.myjson.com/bins/49jw2结果将不会从JSON

我使用SwiftyJSON解析。

变量琐事不会被方法外填充parseJson

var chores: [String] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 

    tfWhat.delegate = self 
    tfHowMuch.delegate = self 

    loadJson() 

    // wont even print 
    for chore in self.chores { 
     print("beschrijving: " + chore) 
    } 

    // prints 0 
    print(chores.count) 
} 

func loadJson() -> Void { 
    let url = NSURL(string: "https://api.myjson.com/bins/49jw2") 

    NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) in 
     if let error = error { 
      print("Error: \(error.localizedDescription)") 
     } else { 
      if let data = data { 
       let json = JSON(data: data) 

       self.parseJson(json["appdata"]["klusjes"][]) 
      } else { 
       print("no data") 
      } 
     } 
    }).resume() 
} 

func parseJson(jsonObject : JSON) -> Void { 
    for (_, value) in jsonObject { 
     self.chores.append(value["beschrijving"].stringValue) 
    } 

    // prints: 
    // beschrijving: Heg knippen bij de overburen 
    // beschrijving: Auto van papa wassen 
    for chore in self.chores { 
     print("beschrijving: " + chore) 
    } 

    // prints: 
    // 2 
    print(chores.count) 
} 

回答

0

当调用异步方法NSURLSession.sharedSession().dataTaskWithURL它就会在后台执行,所以不管你推出紧接在该指令实际上是执行后台任务正在运行,所以你的数组并没有填充而是当你看着它。

克服这个错误的一个简单方法是使用“回调”:一旦数据可用,将执行的关闭

例如,我们的回调

(json: JSON)->() 

添加到loadJson方法:

func loadJson(completion: (json: JSON)->()) 

并发出呼叫,其中数据将可用:

func loadJson(completion: (json: JSON)->()) { 
    let url = NSURL(string: "https://api.myjson.com/bins/49jw2") 
    NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) in 
     if let error = error { 
      print("Error: \(error.localizedDescription)") 
     } else { 
      if let data = data { 
       // the callback executes *when the data is ready* 
       completion(json: JSON(data: data)) 
      } else { 
       print("no data") 
      } 
     } 
    }).resume() 
} 

和使用它与这样一个尾随的关闭:

loadJson { (json) in 
    // populate your array, do stuff with "json" here, this is the result of the callback 
}