Обработка ошибок в swift 3 с использованием objectMapper и alamofire

Как я могу обработать ошибку в блоке завершения, если получить ошибку со стороны сервера. Вот класс объектного сопоставителя для входа в систему.

  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
}

Это сетевой класс, откуда я запускаю службу

// Пользовательский веб-сервис для входа

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

Так, как я могу обработать ошибку в моем блоке завершения контроллера представления?

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
}
Другие вопросы по тегам