Search code examples
swift3alamofireobjectmapper

Error handling in swift 3 using objectMapper and alamofire


How i can handle error in completion block if get error from server side.Here is object mapper class for login.

  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"]
}
}

Here is my api calling from view controller.

   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
}

This is Network class mthod from where i fire the service

//User login web service

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

So how i can handle error in my view controller completion block?


Solution

  • you can just create another handler for errors and call it in error case

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

    usage

    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
    }