我有这段代码,它显然是错误的,因为当我在返回语句中使用FOO时,它超出了函数的范围。我知道(我想我知道),我需要使用闭包来捕获变量,但我不知道如何做到这一点。使用Alamofire & SwiftyJSON。任何帮助都会很好!谢谢!
func getPlayerID(named: String) -> String {
Alamofire.request(.GET, "URL", headers: headers)
.responseJSON { response in
let json = JSON.self(response.result.value!)
for var index = 0; index < json.count; index++ {
if json[index]["Name"].stringValue == named {
var FOO = json[index]["FOO"].stringValue
} // If Statement End
} // For Loop End
} // Alamofire Request End
// Return Statement for getPLayerID Function
return FOO
} // getPlayerID Function End
} // Player Struct End发布于 2015-10-10 06:43:33
基本思想是,getPlayerID不应该返回任何东西,而是应该有一个参数,它是一个闭包,一旦检索到要“返回”的值,就可以使用该值作为参数调用闭包。
但是,我建议在这里做其他的改进:
result是否为.Failure,因为您无法控制可能出现的各种服务器/网络问题。但希望这说明了一个基本的想法:
就我个人而言,我会(a)使String参数成为completionHandler的可选参数;(b)添加另一个可选的错误参数;(c)向getPlayerID添加错误处理
func getPlayerID(completionHandler: ([String]?, ErrorType?) -> Void) {
Alamofire.request(.GET, "URL", headers: headers)
.responseJSON { request, response, result in
switch (result) {
case .Success(let value):
let json = JSON.self(value)
// variable to hold all of the results
var strings = [String]()
// populate the array of strings
for var index = 0; index < json.count; index++ {
if json[index]["Name"].stringValue == named {
strings.append(json[index]["FOO"].stringValue)
}
}
// call the completion handler with the strings
completionHandler(strings, nil)
case .Failure(_, let error):
completionHandler(nil, error)
}
}
}然后,当你想叫它时:
getPlayerID() { strings, error in
// use `strings` here
}
// but not here发布于 2015-10-10 06:52:06
如果发出异步请求,则无法返回在同一函数中响应而收到的值,因为需要时间通过网络将请求发送到服务器并返回。解决这个问题的最好方法是向函数中添加回调参数,而不是返回值。
func getPlayerID(named: String, callback:(foo:String)->()) {
Alamofire.request(.GET, "URL", headers: headers)
.responseJSON { response in
let json = JSON.self(response.result.value!)
for var index = 0; index < json.count; index++ {
if json[index]["Name"].stringValue == named {
var FOO = json[index]["FOO"].stringValue
callback(foo: FOO) // you fire callback here..
} // If Statement End
} // For Loop End
} // Alamofire Request End
} // getPlayerID Function End回调是一个块对象,它将在收到响应时触发。因此,如果没有响应(例如,互联网连接中断),回调就永远不会启动。如何使用这个示例:
self.getPlayerID("ototo") { (foo) -> () in
print("foo received = \(foo)")
}此外,在发送请求和接收响应之间也有一段时间跨度。因此,在应用程序的UI中添加UIActivityIndicatorView是一个很好的做法,直到响应到达为止(如果internet连接突然中断,则处理超时)。
https://stackoverflow.com/questions/33050994
复制相似问题