Alamofire要求为零

安东尼奥·冈萨雷斯(Antonio Gonzalez)占位符图像

我正在开发一个使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章