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

时间:2015-08-14 21:13:55

标签: ios json swift swift2 alamofire

我对有关Swift 2的新版Alamofire有疑问

var arr1 = [0, 1, false, '', 'zero', null];
var arr2 = arr1.filter(function (item) {
  return !!item;
});
console.log(arr2); // [1, 'zero']

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

2 个答案:

答案 0 :(得分:56)

接受的答案很有效,但随着Alamofire 3.0.0的推出,有一些重大变化会影响这种实施。
migration guide有进一步的解释,但我将重点介绍与实际解决方案相关的内容。

  • Response
    所有响应序列化程序(响应除外)都返回一个通用的响应结构。

  • Response type
    结果类型是否已重新设计为不存储NSData的双通用类型?在.Failure案例中。

另请注意,无论回复的内容如何,​​Alamofire都会将完成的任何请求视为成功。因此,您需要在.validate()之前链接.responseJSON()以查看.Failure案例。 阅读更多相关信息here

更新的代码:

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(Swift 2.2)
  • Alamofire 3.3.1
  • SwiftyJSON 2.3.3

答案 1 :(得分:0)

您现在可以立即实现大多数必需的行为,而无需使用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)
            }
        
        }

在上面的代码中,成功案例使用可解码协议自动反序列化JSON到您的结构中。任何错误都会导致错误案例被击中。