我正在使用的JSON文件:https://api.myjson.com/bins/49jw2
我使用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 :(得分: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
}