swift2 如何获取swift 2中Alamofire.request().responseJSON的结果值?

fzsnzjdm  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(265)

我有一个关于Alamofire for Swift 2新版本的问题

Alamofire.request(.POST, urlString, parameters: parameters as? [String : AnyObject])
        .responseJSON { (request, response, result) -> Void in
            let dico = result as? NSDictionary
            for (index, value) in dico! {
                print("index : \(index)     value : \(value)")
            }
    }

在本节中,我想将结果转换为NSDictionary。但是当我编译并放置断点时,调试器说dico为nil。如果我使用debugDescription打印结果,它不是nil,而是包含我所期望的内容。如何转换Result变量?

erhoui1w

erhoui1w1#

公认的答案很好用,但是随着Alamofire 3.0.0的引入,有一些影响这个实现的突破性变化。
migration guide有进一步的解释,但我将突出与实际解决方案相关的解释。

  • 回应
  • 所有响应序列化程序(response除外)都返回一个通用Response结构。*
  • 响应类型
  • Result类型已重新设计为双精度泛型类型,在.Failure情况下不存储NSData?。*

另外,考虑到Alamofire会将任何已完成的请求视为成功,而不管响应的内容如何。因此,您需要在.responseJSON()之前链接一个.validate(),以命中.Failure情况。请在此处阅读更多信息。
更新的代码:

let url = "http://api.myawesomeapp.com"
Alamofire.request(.GET, url).validate().responseJSON { response in
    switch response.result {
    case .Success(let data):
        let json = JSON(data)
        let name = json["name"].stringValue
        print(name)
    case .Failure(let error):
        print("Request failed with error: \(error)")
    }
}

供参考:

  • Xcode 7.3(快速移动2.2)
  • 阿拉莫菲尔3.3.1
  • 快速JSON 2.3.3
yvfmudvl

yvfmudvl2#

如果你不介意使用SwiftyJSON库,这里有一个Xcode 7 Beta 5 + Alamofire 2.0.0-beta.1 + SwiftyJSON(xcode 7分支)的工作示例

Alamofire.request(.GET, url, parameters: params, encoding: ParameterEncoding.URL).responseJSON { (_, _, result) in
    switch result {
        case .Success(let data):
            let json = JSON(data)
            let name = json["name"].string
        case .Failure(_, let error):
            print("Request failed with error: \(error)")
    }
}

编辑:
更新了SwiftyJSON git页面

huus2vyu

huus2vyu3#

现在,您可以实现大多数需要的行为,而无需使用SwiftyJSON。例如,我的OAuthTokenResponse是一个可编码的简单结构体。Alamofire库5.2.2允许您使用“responseDecodable”响应
如果你有一个结构体看起来像这样:

struct OAuthTokenResponse : Codable
{
    var access_token:String?
    var token_type:String?
    var expires_in:Int?
    var scope:String?
}

然后在你的网络中调用(使用Alamofire)

let request = AF.request(identityUrl, method: .post, parameters: parameters, encoding: URLEncoding.httpBody)
    request
        .validate()
        .responseDecodable { (response:AFDataResponse<OAuthTokenResponse>) in

            switch response.result {
            case .success(let data):
                do {
                    let jwt = try decode(jwt: data.access_token!) // example
                    self.connected = true
                    print(jwt)
                } catch {
                    print(error.localizedDescription)
                    self.connected = false
                }

            case .failure(let error):
                    self.connected = false
                    print(error.localizedDescription)
            }

        }

在上面的代码中,success case使用可解码协议自动将JSON反序列化到struct中。任何错误都将导致错误case被命中。

相关问题