在swift中调用方法(Method在下一行之前没有完成)

时间:2016-03-31 02:16:23

标签: ios json swift dictionary methods

尝试从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()函数没有完成?我在逻辑上有这个错误吗?我总是得到一个在这个例子中返回的空字典,这没什么好处。

1 个答案:

答案 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)
}