【问题标题】:Calling methods in swift (Method doesnt finish before next line)快速调用方法(方法在下一行之前没有完成)
【发布时间】:2016-03-31 02:16:22
【问题描述】:

尝试从 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;
}

然后我想测试返回的字典以确保它被填充:

func saveData(){
    let players = getPlayerDataFromAPI()
    print(players.count)
}

我在 viewController viewDidLoad 方法中调用 saveData() 并得到一个空字典...稍后,JSON 函数中的打印语句打印出来。

0
1427

在调用 print(count) 之前 getPlayerDataFromAPI() 函数没有完成是否有原因?我有这个逻辑错误吗?在这种情况下,我总是得到一个空字典,这不好。

【问题讨论】:

  • 你明白“异步”是什么意思吗?在 SO 上进行搜索。这已经在这里处理了很多很多次了。

标签: ios json swift dictionary methods


【解决方案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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多