我正在开发一个使用WebServices的iOS应用程序,我发现Alamofire非常适合我在做的事情,但是我遇到了问题;该应用程序要求用户登录这是Alamofire呼叫,并且一切正常。
问题是,它必须基于另一个Alamofire请求的内容创建一个收集视图,但始终是nil
。
func getJSON(URLToRequest: String) -> JSON {
let comp:String = (prefs.valueForKey("COMPANY") as? String)!
let params = ["company":comp]
var json:JSON!
let request = Alamofire.request(.POST, URLToRequest, parameters: params).responseJSON {
response in
switch response.result {
case .Success:
if let value = response.result.value {
json = JSON(value)
}
default:
json = JSON("");
}
}
debugPrint(request.response)
return json;
}
相同的代码块非常适合登录,但在这种情况下,不适用于调试打印始终打印 nil
您在尝试request.response
设置之前要访问它,请记住Alamofire是异步工作的,因此您必须使用闭包返回JSON,但请记住Alamofire也返回错误,因此我强烈建议使用以下代码代替:
func getJSON(URLToRequest: String, completionHandler: (inner: () throws -> JSON?) -> ()) {
let comp:String = (prefs.valueForKey("COMPANY") as? String)!
let params = ["company":comp]
let request = Alamofire.request(.POST, URLToRequest, parameters: params).responseJSON {
response in
// JSON to return
var json : JSON?
switch response.result {
case .Success:
if let value = response.result.value {
json = JSON(value)
}
completionHandler(inner: { return json })
case .Failure(let error):
completionHandler(inner: { throw error })
}
}
诀窍在于,该getJSON
函数需要一个额外'inner'
的类型为type的闭包() throws -> JSON?
。这个闭包要么提供计算结果,要么抛出。在计算过程中,闭包本身是通过以下两种方式之一构造的:
inner: {throw error}
inner: {return json}
然后,您可以按以下方式调用它:
self.getJSON("urlTORequest") { (inner: () throws -> JSON?) -> Void in
do {
let result = try inner()
} catch let error {
print(error)
}
}
希望对您有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句