2017-05-05 2 views
2

Je suis en train de faire un test de connexion et je dois me reconnecter pour me connecter. Après avoir appuyé sur le bouton de connexion pour envoyer la requête au serveur, l'indicateur d'activité est affiché jusqu'à l'indicateur d'activité est arrêté et l'indicateur d'activité est arrêté La prochaine page, je voudrais ouvrir un autre fil utilisé pour mettre en œuvre l'indicateur d'activité, mais je ne sais pas comment mettre en œuvre, s'il vous plaît aider! Et ce code est modifié de http://www.kaleidosblog.com/how-to-create-a-login-screen-page-in-swift-3-authenticate-an-user-and-keep-the-session-active.Fonction de connexion avec indicateur d'activité

class ViewController: UIViewController { 


    let login_url = "http://www.kaleidosblog.com/tutorial/login/api/Login" 
    let checksession_url = "http://www.kaleidosblog.com/tutorial/login/api/CheckSession" 


    @IBOutlet var username_input: UITextField! 
    @IBOutlet var password_input: UITextField! 
    @IBOutlet var login_button: UIButton! 

    var login_session:String = "" 

    var activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray) 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     username_input.text = "[email protected]" 
     password_input.text = "test" 

     activityIndicator.hidesWhenStopped = true; 
     activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray; 
     activityIndicator.center = view.center; 


     let preferences = UserDefaults.standard 
     if preferences.object(forKey: "session") != nil 
     { 
      login_session = preferences.object(forKey: "session") as! String 
      check_session() 
     } 



    } 

    @IBAction func DoLogin(_ sender: AnyObject) { 

     login_now(username:username_input.text!, password: password_input.text!) 
    } 

    @IBAction func backToMain(_ segue:UIStoryboardSegue){ 
     let preferences = UserDefaults.standard 
     preferences.removeObject(forKey: "session") 
     self.dismiss(animated: true, completion: nil) 

    } 


    func login_now(username:String, password:String) 
    { 
     let post_data: NSDictionary = NSMutableDictionary() 


     post_data.setValue(username, forKey: "username") 
     post_data.setValue(password, forKey: "password") 

     let url:URL = URL(string: login_url)! 
     let session = URLSession.shared 

     let request = NSMutableURLRequest(url: url) 
     request.httpMethod = "POST" 
     request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 

     var paramString = "" 


     for (key, value) in post_data 
     { 
      paramString = paramString + (key as! String) + "=" + (value as! String) + "&" 
     } 

     request.httpBody = paramString.data(using: String.Encoding.utf8) 

     let task = session.dataTask(with: request as URLRequest, completionHandler: { 
     (
      data, response, error) in 

      guard let _:Data = data, let _:URLResponse = response , error == nil else { 

       return 
      } 

      let json: Any? 

      do 
      { 
       json = try JSONSerialization.jsonObject(with: data!, options: []) 
      } 
      catch 
      { 
       return 
      } 

      guard let server_response = json as? NSDictionary else 
      { 
       return 
      } 


      if let data_block = server_response["data"] as? NSDictionary 
      { 
       if let session_data = data_block["session"] as? String 
       { 
        self.login_session = session_data 

        let preferences = UserDefaults.standard 
        preferences.set(session_data, forKey: "session") 
        DispatchQueue.main.async { 
         self.view.addSubview(self.activityIndicator) 
        } 

       } 
      } 
     }) 

     task.resume() 
     LoginDone() 


    } 

    func check_session() 
    { 
     let post_data: NSDictionary = NSMutableDictionary() 


     post_data.setValue(login_session, forKey: "session") 

     let url:URL = URL(string: checksession_url)! 
     let session = URLSession.shared 

     let request = NSMutableURLRequest(url: url) 
     request.httpMethod = "POST" 
     request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 

     var paramString = "" 


     for (key, value) in post_data 
     { 
      paramString = paramString + (key as! String) + "=" + (value as! String) + "&" 
     } 

     request.httpBody = paramString.data(using: String.Encoding.utf8) 

     let task = session.dataTask(with: request as URLRequest, completionHandler: { 
      (
      data, response, error) in 

      guard let _:Data = data, let _:URLResponse = response , error == nil else { 

       return 
      } 


      let json: Any? 

      do 
      { 
       json = try JSONSerialization.jsonObject(with: data!, options: []) 
      } 
      catch 
      { 
       return 
      } 

      guard let server_response = json as? NSDictionary else 
      { 
       return 
      } 

      if let response_code = server_response["response_code"] as? Int 
      { 
       if(response_code == 200) 
       { 
        DispatchQueue.main.async { 
         self.view.addSubview(self.activityIndicator) 
        } 
       } 
       else 
       { 

       } 
      } 



     }) 

     task.resume() 
    } 

    func LoginDone() 
    { 
     self.performSegue(withIdentifier: "gotomenu", sender: nil) 
    } 


    func startActivityIndicator(){ 
     activityIndicator.startAnimating() 
    } 

    func stopActivityIndicator() { 
     activityIndicator.stopAnimating() 
    } 


} 
+0

similaires http://stackoverflow.com/questions/38457750/use-activity-indicator-in-many-vc- Sans-dupliquer-code-swift/ –

Répondre

2

Remplacer ce code avec l'ancien code:

class ViewController: UIViewController { 


let login_url = "http://www.kaleidosblog.com/tutorial/login/api/Login" 
let checksession_url = "http://www.kaleidosblog.com/tutorial/login/api/CheckSession" 


@IBOutlet var username_input: UITextField! 
@IBOutlet var password_input: UITextField! 
@IBOutlet var login_button: UIButton! 

var login_session:String = "" 

var activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray) 

override func viewDidLoad() { 
    super.viewDidLoad() 


    username_input.text = "[email protected]" 
    password_input.text = "test" 

    activityIndicator.hidesWhenStopped = true 
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray 
    activityIndicator.center = view.center 
    activityIndicator.isHidden = true 
    self.view.addSubview(self.activityIndicator) 
    let preferences = UserDefaults.standard 
    if preferences.object(forKey: "session") != nil 
    { 
     login_session = preferences.object(forKey: "session") as! String 
     check_session() 
    } 



} 

@IBAction func DoLogin(_ sender: AnyObject) { 

    login_now(username:username_input.text!, password: password_input.text!) 
} 

@IBAction func backToMain(_ segue:UIStoryboardSegue){ 
    startActivityIndicator() 
    activityIndicator.isHidden = false 
    let preferences = UserDefaults.standard 
    preferences.removeObject(forKey: "session") 
    self.dismiss(animated: true, completion: nil) 
    stopActivityIndicator() 
    activityIndicator.isHidden = true 
} 


func login_now(username:String, password:String) 
{ 
    activityIndicator.isHidden = false 
    startActivityIndicator() 
    let post_data: NSDictionary = NSMutableDictionary() 


    post_data.setValue(username, forKey: "username") 
    post_data.setValue(password, forKey: "password") 

    let url:URL = URL(string: login_url)! 
    let session = URLSession.shared 

    let request = NSMutableURLRequest(url: url) 
    request.httpMethod = "POST" 
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 

    var paramString = "" 


    for (key, value) in post_data 
    { 
     paramString = paramString + (key as! String) + "=" + (value as! String) + "&" 
    } 

    request.httpBody = paramString.data(using: String.Encoding.utf8) 

    let task = session.dataTask(with: request as URLRequest, completionHandler: { 
     (
     data, response, error) in 
     self.stopActivityIndicator() 
     self.activityIndicator.isHidden = true 
     guard let _:Data = data, let _:URLResponse = response , error == nil else { 

      return 
     } 

     let json: Any? 

     do 
     { 
      json = try JSONSerialization.jsonObject(with: data!, options: []) 
     } 
     catch 
     { 
      return 
     } 

     guard let server_response = json as? NSDictionary else 
     { 
      return 
     } 


     if let data_block = server_response["data"] as? NSDictionary 
     { 
      if let session_data = data_block["session"] as? String 
      { 
       self.login_session = session_data 

       let preferences = UserDefaults.standard 
       preferences.set(session_data, forKey: "session") 
       DispatchQueue.main.async { 
        self.LoginDone() 
       } 

      } 
     } 
    }) 

    task.resume() 



} 

func check_session() 
{ 
    let post_data: NSDictionary = NSMutableDictionary() 


    post_data.setValue(login_session, forKey: "session") 

    let url:URL = URL(string: checksession_url)! 
    let session = URLSession.shared 

    let request = NSMutableURLRequest(url: url) 
    request.httpMethod = "POST" 
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 

    var paramString = "" 


    for (key, value) in post_data 
    { 
     paramString = paramString + (key as! String) + "=" + (value as! String) + "&" 
    } 

    request.httpBody = paramString.data(using: String.Encoding.utf8) 

    let task = session.dataTask(with: request as URLRequest, completionHandler: { 
     (
     data, response, error) in 

     guard let _:Data = data, let _:URLResponse = response , error == nil else { 

      return 
     } 


     let json: Any? 

     do 
     { 
      json = try JSONSerialization.jsonObject(with: data!, options: []) 
     } 
     catch 
     { 
      return 
     } 

     guard let server_response = json as? NSDictionary else 
     { 
      return 
     } 

     if let response_code = server_response["response_code"] as? Int 
     { 
      if(response_code == 200) 
      { 
       DispatchQueue.main.async { 
        self.view.addSubview(self.activityIndicator) 
       } 
      } 
      else 
      { 

      } 
     } 



    }) 

    task.resume() 
} 

func LoginDone() 
{ 
    self.performSegue(withIdentifier: "gotomenu", sender: nil) 
} 


func startActivityIndicator(){ 
    activityIndicator.startAnimating() 
} 

func stopActivityIndicator() { 
    activityIndicator.stopAnimating() 
} 
} 
+0

Mais quand j'ai appuyé sur le bouton de déconnexion, l'indicateur d'activité n'a pas disparu –

+0

Je m'applique uniquement sur la fonction de connexion –

+0

vérifier le code de mise à jour. –

2

Essayez d'utiliser SVProgressHUD. C'est le cadre le plus simple que j'ai jamais vu. SVProgressHUD on GitHub

Installer:

Dans votre PODFILE:

pod 'SVProgressHUD' 

Puis dans le terminal:

pod install 

Comment utiliser:

import SVProgressHUD 

pour commencer:

SVProgressHUD.show() 

à rejeter:

SVProgressHUD.dismiss() 

Il est très simple et utile. Essayez-le.

Hope it helps

+0

Merci, je vais essayer. –