2017-09-09 13 views
1

サーバサイドからエラーが発生した場合、どのようにエラーを処理できますか。ログイン用のオブジェクトマッパークラスです。objectMapperとalamofireを使用したswift 3でのエラー処理

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 
} 

これは、ネットワーククラスmthodである私は、サービス

//ユーザログイン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) 
     } 
} 
} 

を発射どこから、どのように私は私のビューコントローラ完了ブロックでエラーを処理することができますか?

+0

を呼び出すことができますが、現在、エラーは、サーバー側から処理されないウェブ応答 –

+0

を投稿することができます。しかし、私はエラーがサーバー側から来る場合、どのように処理できるかを知りたい。私はsuccesの完了ブロックを使用しているので、どのようにエラーの完了ブロックを使用することができますか? – user3655325

答えて

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 
} 
+0

Andrewが突然このエラーを表示し始めました。 "この関数では、関数型以外の値 'Error'を呼び出せません。 error(error、response.response?.statusCode)//エラーハンドラを呼び出す – user3655325

+0

答えを更新しました(errorHandlerに名前を変更しました)。今それは動作するはずです。 – Andrew

+0

ありがとうアンドリュー.. :) – user3655325

関連する問題