Alamofire 请求为零

Alamofire request coming up nil

我正在开发一个 iOS 应用程序,用户 WebServices 和我发现 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;
}

相同的代码块非常适合登录,但在这种情况下不是 BTW 调试打印总是打印 nil

您正在尝试在设置之前访问 request.response,请记住 Alamofire 异步工作,因此您必须 return如果 JSON 使用闭包,但请记住 Alamofire 也会 return 出错,因此我强烈建议改用以下代码:

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)
  }
}

希望对你有所帮助。