Alamofire请求来临零

我正在开发一个iOS应用程序,用户Web服务和我发现Alamofire只是完美的我在做什么,但我有一个问题; 该应用程序要求用户login这是一个Alamofire电话,并做得很好。

问题是,它必须创build一个基于另一个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; } 

相同的代码块完美的login,但不在这种情况下BTWdebugging打印总是打印nil

调试打印

在尝试访问request.response之前,请记住Alamofire是asynchronous工作的 ,因此您必须使用闭包返回JSON,但请记住Alamofire也会返回一个错误,所以我强烈build议使用代码如下:

 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'的types() throws -> JSON? 。 这个闭包将提供计算的结果,否则会抛出。 封闭本身是通过以下两种方法之一在计算过程中构build的:

  • 在发生错误的情况下: inner: {throw error}
  • 如果成功: inner: {return json}

然后你可以这样调用它:

 self.getJSON("urlTORequest") { (inner: () throws -> JSON?) -> Void in do { let result = try inner() } catch let error { print(error) } } 

我希望这可以帮助你。