尝试从API中提取一些JSON数据,然后将其保存到核心数据中。
我目前的做法是拉入JSON数据并返回该数组,然后迭代并保存到核心数据。
拉入数据:(正常工作)
func getPlayerDataFromAPI() -> [Dictionary<String,AnyObject>]{
let url: String = "http://api.fantasy.nfl.com/v1/players/stats?"
let request : NSMutableURLRequest = NSMutableURLRequest()
var jsonData = [Dictionary<String,AnyObject>]()
request.HTTPMethod = "GET"
request.URL = NSURL(string: url)
session.dataTaskWithRequest(request) { (data, response, error) -> Void in
do {
let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as? NSDictionary
if (jsonResult != nil) {
if let playerData = jsonResult?["players"] as? [Dictionary<String, AnyObject>]{
jsonData = playerData
print(jsonData.count)
}
} else {
print("No Data")
}
}
catch {
print("Error Occured")
}
}.resume()
return jsonData;
}
然后我想测试返回的Dictionary以确保它被填充:
func saveData(){
let players = getPlayerDataFromAPI()
print(players.count)
}
我在viewController viewDidLoad方法中调用saveData()并获取一个空字典...片刻之后,JSON函数中的print语句将打印出来。
0
1427
有没有理由在调用print(count)之前getPlayerDataFromAPI()函数没有完成?我在逻辑上有这个错误吗?我总是得到一个在这个例子中返回的空字典,这没什么好处。
答案 0 :(得分:1)
您正在尝试同步返回异步函数的结果。 session.dataTaskWithRequest
传递一个闭包,在请求完成之前不会执行。因此,在jsonData = playerData
函数已经返回之后,getPlayerDataFromAPI()
语句才会执行(此时jsonData
仍然是您在函数开头定义的空字典)。
执行您尝试执行的操作的一种方法是允许将闭包传递到 您的 函数;像这样的东西(我没有测试过这段代码):
func getPlayerDataFromAPI(completion: (data: [String: AnyObject]) -> Void)
然后,在您指定jsonData = playerData
的位置,您可以将数据“返回”给调用者,如下所示:
completion(data: jsonData)
调用此函数看起来像这样:
getPlayerDataFromAPI() { (data) -> Void in
print(data)
}