2017-09-28 2 views
0

Salut, je suis nouveau à swift et alomafire. Quelqu'un peut-il suggérer comment faire l'optimisation du code? Ceci est mon poste et demande formulée pour différentes années api:l'optimisation du code ne fonctionne pas dans ios swift?

func getPDataFromURL(_ onCompletion:@escaping (Dictionary<String, Any>)-> Void) 
     { 
     let token = UserDefaults.standard.string(forKey: "UserLoginToken") 
     let Usertype = UserDefaults.standard.string(forKey: "Usertype") 
     let Userbranchid = UserDefaults.standard.string(forKey: "Userbranchid") 

     let UrlStraing = FETCH_Parent_Profile_URL 

     print(UrlStraing) 

      let url = URL(string: UrlStraing)! 
     var urlRequest = URLRequest(url:url) 
     urlRequest.httpMethod = "GET" 
     urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") 
     urlRequest.addValue("application/json", forHTTPHeaderField: "Accept") 
      let userToken = "Token token=" + token! as String 
      urlRequest.addValue(userToken, forHTTPHeaderField: "Authorization") 
     Alamofire.request(urlRequest).responseJSON { (response:DataResponse<Any>) in 
      switch(response.result) { 
      case .success(_): 
       if response.result.value != nil{ 
        print(response.result.value!) 
        onCompletion(response.result.value! as! Dictionary<String, Any>) 
       } 
       break 

      case .failure(_): 
       print(response.result.error!) 
       onCompletion(response.result.error as! Dictionary<String, Any>) 
       break 
      } 
     } } ` 

Et voici ma deuxième demande de poste pour une autre api:

func getSDataFromURL(_ onCompletion:@escaping (Dictionary<String, Any>)-> Void) { 
     let token = UserDefaults.standard.string(forKey: "UserLoginToken") 
     let Usertype = UserDefaults.standard.string(forKey: "Usertype") 
     let Userbranchid = UserDefaults.standard.string(forKey: "Userbranchid") 

     let UrlStraing = FETCH_School_Info_URL + "branch_id=" + Userbranchid! + "&student_id=86&user_type=" + Usertype! 

     print(UrlStraing) 

     let url = URL(string: UrlStraing)! 
     var urlRequest = URLRequest(url:url) 
     urlRequest.httpMethod = "GET" 
     urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") 
     urlRequest.addValue("application/json", forHTTPHeaderField: "Accept") 
     let userToken = "Token token=" + token! as String 
     urlRequest.addValue(userToken, forHTTPHeaderField: "Authorization") 
     Alamofire.request(urlRequest).responseJSON { (response:DataResponse<Any>) in 
      switch(response.result) { 
      case .success(_): 
       if response.result.value != nil{ 
        print(response.result.value!) 
        onCompletion(response.result.value! as! Dictionary<String, Any>) 
       } 
       break 

      case .failure(_): 
       print(response.result.error!) 
       onCompletion(response.result.error as! Dictionary<String, Any>) 
       break 
      } 
     } } 

Et d'appeler la fonction dans viewcontroller comme ceci:

`func SetUpSchoolUIProfiledata() { 
     Common.sharedInstance.StartActivity(view: self.view) 
     DispatchQueue.main.async { 
     APIManager.sharedInstance.getSchoolProfileDataFromURL(){(userJson)-> 
Void in 

      self.stop() 
      let swiftyJsonVar = JSON(userJson) 
      print("userJson userJson userJson userJson",userJson) 

      print("swiftyJsonVar",swiftyJsonVar) 

      let message = swiftyJsonVar["message"].rawString() 
      let info = swiftyJsonVar["info"].rawString()! 

      let jsonData = info.data(using: .utf8)! 
      let dictionary = try? JSONSerialization.jsonObject(with: jsonData, options: []) as! Dictionary<String, Any> 

      self.schoolName_lbl.text = dictionary?["name"] as? String 
      self.add1_lbl.text = dictionary?["add_line1"] as? String 
      print("imgURLstring is ",self.imgURLstring) 
      self.SetUpProfileImage() 
     } 
     } } 

comment créer une seule fonction multiple post et obtenir des demandes.

+0

vous pouvez créer la classe singleton pour frapper webservices et passe paramètres et url pour réutilisable –

Répondre

2

Vous pouvez créer la classe singleton comme celui-ci quand vous voulez appeler le service Web, utilisez cette méthode

class DataProvider: NSObject { 

    class var sharedInstance:DataProvider { 
     struct Singleton { 
      static let instance = DataProvider() 
     } 
     return Singleton.instance 
    } 

    let baseUrl:String = "http://192.168.1.25:3004/api3/v3/" 



    func putData(parameter:[String:String], url:String, _ successBlock:@escaping (_ response: JSON)->Void , errorBlock: @escaping (_ error: NSError) -> Void){ 

      let path = baseUrl + url 
      print(path) 
      print(parameter) 

      let headers = ["authorization": AppData().token] 

      Alamofire.request(path, method: .put, parameters: parameter, encoding: JSONEncoding.default, headers: headers).responseJSON { response in 

       switch response.result { 
       case .success: 
        if let value = response.result.value { 
         let json = JSON(value) 
         successBlock(json) 
        } 
       case .failure(let error): 
        errorBlock(error as NSError) 
       } 
      } 
    } 

appel comme celui-ci

DataProvider.sharedInstance.putData(parameter: parameter, url: "users/account/update", { (response) in 
      print(response) 

      if response["status"].stringValue == "200" { 
       Utility.showMessageDialog(onController: self, withTitle: "", withMessage: response["message"].stringValue) 
      } 


     }) { (error) in 
      print(error) 
     } 
+0

J'ai déjà fait pareil mais pour chaque url je crée une autre fonction. – kishore

+0

@kishore créer un seul appel de méthode d'où vous voulez utiliser ceci: - vous avez 4 contrôleur de vue puis utilisez cette méthode chaque contrôleur de vue –

+0

veuillez voir ci-dessus mon code getParentDataFromURL et getSchoolProfileDataFromURL sont deux fonctions 'post' que j'utilise deux contrôleurs de vue différents, et pour deux fonctions apis également différentes. @ios singh – kishore