功能未按顺序运行

时间:2016-03-06 15:45:28

标签: ios swift closures

在viewdidload中我有以下方法:

var savedSummonerID : Int?
savedSummonerID = LeagueMethodHelper.retrieveSummonerIDFromSummonerName(serverNameAbbreviation, summonerName : summonerName) 
print("haha \(self.savedSummonerID)")

我希望按顺序运行方法,但print statement实际上是先调用。

retrieveSummonerIDFromSummonerName描述如下:

static func retrieveSummonerIDFromSummonerName(serverName : String, summonerName : String) -> Int {
    var savedSummonerID = 0
    Alamofire.request(.GET, "https://\(serverName).api.pvp.net/api/lol/\(serverName)/v1.4/summoner/by-name/\(summonerName)?api_key=(key)")
        .responseJSON { response in
            print(response.response?.statusCode) // URL response

            if let JSON = response.result.value {
                if let summonerJSONInfo = JSON[summonerName.lowercaseString] as? [String:AnyObject] {
                    if let summonerID = summonerJSONInfo["id"] as? Int {
                        savedSummonerID = summonerID
                        print(summonerID)
                    }
                    if let SummonerName = summonerJSONInfo["name"] as? String {
                        print(SummonerName)
                    }
                }
            }
    }
    return savedSummonerID
}

我认为按顺序运行函数的解决方案是将上面的函数放入闭包中,但我不知道如何才能完成。

2 个答案:

答案 0 :(得分:1)

您无法从异步任务返回。

您的Alamofire任务在后台执行,并且您返回一个默认值,这就是看起来像它被跳过的原因 - 但它只是在后台启动并且结果被忽略。

解决方案是使用“完成处理程序”(回调)而不是返回。

示例:

// (id: Int)->() is the completion handler signature that we add to your method parameters

static func retrieveSummonerIDFromSummonerName(serverName : String, summonerName : String, completion:(id: Int)->()) {
    Alamofire.request(.GET, "https://\(serverName).api.pvp.net/api/lol/\(serverName)/v1.4/summoner/by-name/\(summonerName)?api_key=xxx")
        .responseJSON { response in
            print(response.response?.statusCode) // URL response

            if let JSON = response.result.value {
                if let summonerJSONInfo = JSON[summonerName.lowercaseString] as? [String:AnyObject] {
                    if let summonerID = summonerJSONInfo["id"] as? Int {

                        // use the completion where the result becomes available
                        completion(id: summonerID)

                    }
                    if let SummonerName = summonerJSONInfo["name"] as? String {
                        print(SummonerName)
                    }
                }
            }
    }
}

你这样称呼它,带有“尾随闭包”:

LeagueMethodHelper.retrieveSummonerIDFromSummonerName(serverNameAbbreviation, summonerName: summonerName) { (id) in
    savedSummonerID = id
    print(savedSummonerID)
}

答案 1 :(得分:0)

您正在retrieveSummonerIDFromSummonerName中启动异步任务。完成后,执行该块:

    .responseJSON { response in
        print(response.response?.statusCode) // URL response

        if let JSON = response.result.value {
            if let summonerJSONInfo = JSON[summonerName.lowercaseString] as? [String:AnyObject] {
                if let summonerID = summonerJSONInfo["id"] as? Int {
                    savedSummonerID = summonerID
                    print(summonerID)
                }
                if let SummonerName = summonerJSONInfo["name"] as? String {
                    print(SummonerName)
                }
            }
        }
}

如果您希望在之后执行print语句,可以将其包含在此块的末尾,如下所示:

    .responseJSON { response in
        print(response.response?.statusCode) // URL response

        if let JSON = response.result.value {
            if let summonerJSONInfo = JSON[summonerName.lowercaseString] as? [String:AnyObject] {
                if let summonerID = summonerJSONInfo["id"] as? Int {
                    savedSummonerID = summonerID
                    print(summonerID)
                }
                if let SummonerName = summonerJSONInfo["name"] as? String {
                    print(SummonerName)
                }
            }
        }
    print("haha \(self.savedSummonerID)")
}

或者,您可以实现某种回调,您可以在完成块的末尾以相同的方式调用它。