【问题标题】:Error handling in swift 3 using objectMapper and alamofireswift 3 中使用 objectMapper 和 alamofire 处理错误
【发布时间】:2018-02-18 07:07:08
【问题描述】:

如果从服务器端获取错误,我如何处理完成块中的错误。这是用于登录的对象映射器类。

  class Login: Mappable {
var result: LoginData?
var success: Bool?
var error: String?

required init?(map: Map){

}

func mapping(map: Map) {

    result <- map["data"]
    success <- map["success"]
    error <- map["error"]

}
}

class LoginData: Mappable {
var name: String?
var title: String?
var token: String?
var imageUrl: String?

required init?(map: Map){

}

func mapping(map: Map) {

    name <- map["name"]
    title <- map["title"]
    token <- map["token"]
    name <- map["name"]
    imageUrl <- map["imageUrl"]
}
}

这是我从视图控制器调用的 api。

   func loginMethod(){
    let postData = ["username":loginDict.object(forKey: KUserUserId) as! String,
                    "password": loginDict.object(forKey: KUserPass) as! String]

    userLoginHttp(parameters: postData){ completion in
        self.getUserLoginResponse(result: completion)
    }
}

func getUserLoginResponse(result: LoginData) {
 // Here i do further
}

这是我启动服务的网络类方法

//用户登录web服务

func userLoginHttp(parameters:Parameters, completion:@escaping (_  
 result:LoginData)->()) {
let defaultObject = UserDefaults.standard
var headerToken = String()
if let x = defaultObject.object(forKey: KDeviceToken)
{
  headerToken = x as! String
}
else{
    headerToken = ""
}

let headers = ["fcmToken": headerToken]

Alamofire.request(KLoginUrl, method: .post, parameters: parameters,encoding: JSONEncoding.default, headers: headers)
    .validate()
    .responseObject{ (response: DataResponse<Login>) in
        switch response.result{
        case .success:
            let value = response.result.value
            completion((value?.result)!)
        case .failure(let error):
            print(error.localizedDescription)
        }
}
}

那么我如何处理视图控制器完成块中的错误?

【问题讨论】:

  • 你能发布你的网络回复吗
  • 当前错误未从服务器端处理。但我想知道如果错误来自服务器端,我该如何处理。意味着我在成功时使用完成块,那么我如何使用完成块来处理错误?

标签: swift3 alamofire objectmapper


【解决方案1】:

您可以为错误创建另一个处理程序并在错误情况下调用它

func userLoginHttp(parameters:Parameters,
                       completion:@escaping (_ result:LoginData)->(),
                       errorHandler:@escaping (_ result:Error,_ statusCode:Int?)->()//error handler
        ) {
        let defaultObject = UserDefaults.standard
        var headerToken = String()
        if let x = defaultObject.object(forKey: KDeviceToken)
        {
            headerToken = x as! String
        }
        else{
            headerToken = ""
        }

        let headers = ["fcmToken": headerToken]

        Alamofire.request(KLoginUrl, method: .post, parameters: parameters,encoding: JSONEncoding.default, headers: headers)
            .validate()
            .responseObject{ (response: DataResponse<Login>) in
                switch response.result{
                case .success:
                    let value = response.result.value
                    completion((value?.result)!)
                case .failure(let error):
                    errorHandler(error,response.response?.statusCode)//call error handler
                    print(response.response?.statusCode)
                    print(error.localizedDescription)
                }
        }
    }

用法

func loginMethod(){
    let postData = ["username":loginDict.object(forKey: KUserUserId) as! String,
                    "password": loginDict.object(forKey: KUserPass) as! String]

    userLoginHttp(
        parameters: postData,
        completion:{ completion in
            self.getUserLoginResponse(result: completion)
    },
        errorHandler:{ error,code in
            //do your error stuff
    })
}

func getUserLoginResponse(result: LoginData) {
    // Here i do further
}

【讨论】:

  • 安德鲁突然开始在这一行向我显示这个错误“无法调用非函数类型'错误'的值”。 error(error,response.response?.statusCode)//调用错误处理程序
  • 我更新了答案(将错误重命名为errorHandler)。现在它应该可以工作了。
  • 谢谢安德鲁.. :)
猜你喜欢
  • 2023-03-14
  • 2020-11-27
  • 2016-06-28
  • 2014-12-27
  • 2016-12-14
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多