Alamofire 请求为零
Posted
技术标签:
【中文标题】Alamofire 请求为零【英文标题】:Alamofire request coming up nil 【发布时间】:2016-02-12 21:56:41 【问题描述】:我正在开发一个用户 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
【问题讨论】:
【参考方案1】:您尝试在设置之前访问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'
,类型为() 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)
希望对你有所帮助。
【讨论】:
这非常完美!!多谢;但你看我对 Swift 有点陌生,代码在“inner:() throws -> JSON?”中迷失了我。部分 不客气,还有另一种方法可以使用只返回 JSON 的闭包,但我认为这是最好的,因为让你在过程中发现错误,闭包是一个很难的话题开始,但一旦你得到它,它就是一个强大的工具。(inner: () throws -> JSON?
只是一个返回 JSON?
或抛出错误的函数,仅此而已,别害怕以上是关于Alamofire 请求为零的主要内容,如果未能解决你的问题,请参考以下文章
使用 ObjectMapper 和 Alamofire 时对象始终为零