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 请求为零的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 打印请求给出 nil

使用 ObjectMapper 和 Alamofire 时对象始终为零

Alamofire 完成处理程序问题

Alamofire.request().responseObject 不返回响应

Alamofire 4 请求打开天气

var 请求:Alamofire.Request?使用未声明类型的 Alamofire