Alamofire request coming up nil

穿精又带淫゛_ 提交于 2019-12-24 15:42:49

问题


I'm developing an iOS app which user WebServices and I find Alamofire just perfect for what I'm doing but I'm having a problem; the app asks the user to login which is an Alamofire call and does it just fine.

The problem is, it has to create a collection view based on the content of another Alamofire request but is always 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;
}

The same codeblock works perfect for the Login but doesn't in this case BTW the debug Print always print nil


回答1:


You're trying to access to request.response before it has been set, remember that Alamofire works asynchronously, so you have to return in your case the JSON using closures, but remember that Alamofire also returns an error, so I strongly recommend use the following code instead:

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

The trick is that the getJSON function takes an additional closure called 'inner' of the type () throws -> JSON?. This closure will either provide the result of the computation, or it will throw. The closure itself is being constructed during the computation by one of two means:

  • In case of an error: inner: {throw error}
  • In case of success: inner: {return json}

And then you can call it like in this way:

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

I hope this help you.



来源:https://stackoverflow.com/questions/35372850/alamofire-request-coming-up-nil

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!