2017-09-21 2 views
0

Je dois rappeler l'api lors de la réception d'une erreur spécifique dire le code d'erreur -1005.Alamofire meilleur moyen de rappeler api en cas d'échec

Je veux gérer cela dans les fichiers Alamofire afin qu'il puisse fonctionner avec toutes les API du projet.

Je menais dans ce AFNetworking de ObjC dans dataTaskWithHTTPMethod avec le code ci-dessous: -

if (failure) 
     { 
      if (error.code == -1005) 
      { 
       [self POST:URLString parameters:parameters progress:nil success:success failure:failure]; 
      }   
} 

Quelqu'un peut-il me aider à faire cela dans Alamofire?

+1

montrer votre essayé le code –

+0

je ne pouvais pas définir d'où Alamofire appelle le succès ou le bloc d'échec de la demande donné –

+0

Avez-vous lu cette https://github.com/Alamofire/Alamofire –

Répondre

0
//MARK: Your method 

    func hitYourService(){ 
      showActivityIndicator(decision: true, inViewConroller: self, animated: true) 
      let deviceToken = HelpingClass.userDefaultForKey(key: "deviceToken") 
      let paramDict = ["email":txtFEmail.text ?? "" ,"password":txtFPassword.text ?? "" ,"device_token":deviceToken] 

      NetworkManager.instance().hitPostServiceJsonForm(paramDict, myReqURL: ServiceMethods.serviceBaseURL+ServiceMethods.login, unReachable: { 
       // Here you can handle the case if there is no internet connection 
      }) { (response) in 
       showActivityIndicator(decision: false, inViewConroller: self, animated: true) 
       if response != nil{ 
        if response?["error_code"] as! Int == 0{ 
         //Handle your response 

        }else{ 
         //Show error 
         showHudWithMessage(message: response?["error_msg"] as! String, inViewConroller: self, animated: true, hideAfter: 2) 
        } 
       }else{ 
        //You can hit back your service 
        self.hitYourService() 
       } 

      } 
     } 


//MARK: Alamofire method to hit service, written in NetworkManager class   


     func hitPostServiceJsonForm(_ params:Dictionary<String,Any>, myReqURL:String, unReachable:(() -> Void),handler:@escaping ((Dictionary<String,Any>?) -> Void)) { 
      if networkReachable() == false { 
       unReachable() 
      } 
      var request = URLRequest(url: URL(string: myReqURL)!) 
      request.httpMethod = "POST" 
      request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
      print_debug(object: "ReqParameter: \(String(describing: params))") // http url response 

      //JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) 

      request.httpBody = try! JSONSerialization.data(withJSONObject: params, options: []) 



      Alamofire.request(request).responseJSON { response in 
       // SwiftLoader.hide() 
       print_debug(object: "Request: \(String(describing: response.request))") // original url request 
       print_debug(object: "Response: \(String(describing: response.response))") // http url response 
       print_debug(object: "Result: \(response.result)")       // response serialization result 

       print_debug(object: "Result.value \(String(describing: response.result.value))") 
       switch response.result { 
       case .success: 
        if let jsonDict = response.result.value as? Dictionary<String,Any> { 
         print_debug(object: "Json Response: \(jsonDict)") // serialized json response 
         handler(jsonDict) 
        } 
        else{ 
         handler(nil) 
        } 
        if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { 
         print("Server Response: \(utf8Text)") // original server data as UTF8 string 
        } 
        break 
       case .failure(let error): 
        handler(nil) 
        print_debug(object: error) 
        break 
       } 
      } 
     } 
+0

Je veux faire cela dans la classe d'alamofire afin qu'il fonctionne avec tous les appels api –

+0

vous pouvez placer cette méthode -> hitPostServiceJsonForm dans votre classe de réseau – Ishika

+0

voir dans mon projet J'ai appelé api à de nombreux endroits, avec votre solution, j'ai besoin de changer tous les appels api dans ma classe de réseau. Ce que je veux, c'est ajouter le code de gestion des erreurs dans la classe Alamore afin qu'il reflète partout –

0

permet de comprendre avec un exemple. Laissez-moi deviner que vous avez créé une classe pour gérer tous les trucs webservice realted là-bas. (si pas encore alors il sera bon d'en créer un pour la meilleure pratique).

Maintenant, créez deux typealias pour gérer la réponse.

ici est: -

ici, je suppose encore une fois que vous voulez tout dictionnaire pour une réponse de succès et erreur pour une réponse d'échec.

typealias successCompletion = (([String:Any]) ->()) 
typealias failureCompletion = ((Error) ->()) 

maintenant ici son un WSManager classe pour manipuler toutes les API Articles liés là-bas.

class AlamofireManager { 

    static func sampleFunctionOfWebService(successCompletion:successCompletion , failureCompletion:failureCompletion) { 

     if success { 
      successCompletion(["Key":"success"]) 
     } else { 
      failureCompletion(-1005 as! Error) 
     } 
    } 
} 

vous devez passer les deux typealias en fonction pour obtenir CallBack dans la classe désirée.

Ici, à seule fin de compréhension, nous allons transmettre le dictionnaire statique : -> ["Key": "success"] et static -1005 comme erreur.

maintenant comment utiliser cette fonction dans notre classe désirée?

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func wsCalling() { 

     AlamofireManager.sampleFunctionOfWebService(successCompletion: { (dict) in 

      print(dict) 

     }) { (error) in 

      if error.code == -1005 { 
       self.wsCalling() // recall API Again 
      } else { 
       // your other logic 
      } 

     } 
    } 

} 

Je ne l'ai pas mentionné ici pour URLSeeionTask et tout, sa bonne chose à gérer URLSeeionTask. Si vous avez une instance de URLSeeionTask de API précédente, annulez-la d'abord, puis essayez de la rappeler à nouveau.

Codage heureux.