我是 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 = 函数调用。
谢谢
最佳答案
您无法按照您的意愿直接执行此操作。由于所有 Alamofire 函数都是异步运行的,因此您无法准确判断何时会得到结果,事实上,Alamofire.request
方法只为您提供一个对象,该对象您可以使用 responseJSON
或其他处理程序(例如 responseString
)来锁定回调。您无法控制何时调用此回调 - 它将在请求完成时运行。
由于我们对 Request
所能做的就是向其添加回调,因此我们必须使用回调才能对请求的结果执行任何操作称呼。幸运的是,您可以将回调指定为闭包,并且闭包有一个特殊的属性:它们关闭其执行环境(因此得名),这意味着创建闭包的词法环境中可用的所有变量也可以在函数内部使用。
这意味着这是完全有效的代码:
var fruits: [String] = []
callYelp() { responseObject in
fruits = responseObject
}
如果您需要在回调设置 fruits
时收到通知(因为您无法控制回调实际调用的时间),您可能需要添加 didSet
observer到水果
:
var fruits: [String] = [] {
didSet {
//handle anything that needs to be handled
//when you get data
}
}
callYelp() {
fruits = $0
}
在最后一个示例中,我使用了速记闭包参数语法,您可以使用隐式名称 $0
、$1
等,而不是命名每个闭包参数。
关于json - 如何获取 Alamofire 函数结果(完成)并将其设置为稍后可以在 Swift 3.1 中的代码中轻松调用的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43593040/