如何获得Alamofire函数结果(Done)并将其设置为我稍后可以在Swift 3.1中轻松调用的值?

时间:2017-04-24 16:12:27

标签: json swift xcode function swift3

我是Swift 3的新手。这是我的代码:

func callYelp(completionHandler: @escaping (AnyObject) -> ()) {

Alamofire.request("https://api.yelp.com/v3/businesses/search", parameters: getParameters, headers: headers)
    .responseJSON { response in
        switch response.result {
        case .success(let value):
            let json = JSON(value)
            //print("JSON: \(json)")
            let arrayNames =  json["businesses"].arrayValue.map({$0["name"].stringValue})
            let arrayRating =  json["businesses"].arrayValue.map({$0["rating"].stringValue})
            print(arrayNames, arrayRating)

            completionHandler(arrayNames as AnyObject)


        case .failure(let error):
            print(error)
        }
}

如何将其称为并将其设置为变量?

callYelp() { responseObject in
        print(responseObject)
        return
    }

如:

var fruits =函数调用。

由于

1 个答案:

答案 0 :(得分:2)

你无法直接按照自己的意愿这样做。由于所有Alamofire函数都以异步运行,因此您无法确切知道何时会有结果,实际上Alamofire.request方法只会为您提供一个对象可以使用responseJSON或其他处理程序(例如responseString)锁定回调。您无法控制何时调用此回调 - 它将在请求完成时运行。

由于我们可以使用Request添加一个回调函数,因此我们必须使用回调来执行任何与调用的结果。幸运的是,您可以将回调指定为闭包,并且闭包具有特殊属性:它们关闭它们的执行环境(因此名称),这意味着在创建闭包的词汇环境中可用的所有变量也可以在函数内部使用。

这意味着这是完全有效的代码:

var fruits: [String] = []
callYelp() { responseObject in
    fruits = responseObject
}

如果您需要收到有关回调设置fruits的时间的通知(因为您无法控制实际调用回调的时间),您可能需要向{{1}添加didSet observer }}:

fruits

在最后一个例子中,我使用了简写闭包参数语法,而不是命名每个闭包参数,你可以使用隐式名称var fruits: [String] = [] { didSet { //handle anything that needs to be handled //when you get data } } callYelp() { fruits = $0 } $0等等。