2016-08-16 6 views
0

Ich versuche mich über den Swift einzuloggen. Ich bekomme die richtigen Daten in Form von JSON und in der Lage, die Daten zu extrahieren, aber wenn ich versuche, die Erfolgsmeldung im Terminal zu drucken, dann muss ich zweimal auf den Login-Button drücken.Wie navigiere ich zu einem anderen Viewcontroller, nachdem ich eine Antwort vom Server bekommen habe

@IBAction func loginButton(sender: UIButton) { 

    //test.text = usernameText.text 

    let user = usernameText.text! 
    let pass = passwordText.text! 

    let a = "http://www.example.com/app/login.php?username=" 
    let b = "&password=" 
    let c = a + user + b + pass 

    let url = NSURL(string: "\(c)")! 


    let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in 

     if let urlContent = data { 

      do { 

       let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 



       if let custdetails : [NSDictionary] = jsonResult["data"] as? [NSDictionary] { 

        for person: NSDictionary in custdetails { 
         //for (name,value) in person { 
         //  print("\(name) , \(value)") 
         //print(person.valueForKey("CustId")!) 
         //} 
         let userid:String = person.valueForKey("CustId") as! String 
         print(userid) 
         //NSUserDefaults.standardUserDefaults().setBool(true, forKey: "IsUserLoggedIn") 
         NSUserDefaults().setString(userid, forKey: "userName") 
         NSUserDefaults.standardUserDefaults().synchronize() 
         self.dismissViewControllerAnimated(true, completion: nil) 
         self.message = jsonResult["message"] as! String 

        } 
       } 

      } catch { 

       print("JSON serialization failed") 
      } 
     } 

    } 
    task.resume() 
    print(message) 

    //navingation code 

} 

Ich habe die Benutzer-ID gedruckt, wenn ich von der json erhalte SO, wenn ich auf dem Login-Button klicken kann ich die ID in der Konsole sehen, aber kann nicht die Meldung, die ich auf der zweiten letzte Zeile gedruckt

Wenn ich wieder auf den Login-Button klicke, wird die Nachricht gedruckt und die ID wird ebenfalls erneut gedruckt, was bedeutet, dass mein Code das zweite Mal ausgeführt wird.

Vielen Dank für Ihre Hilfe im Voraus Jede Hilfe wird geschätzt.

+0

Sie sollten Ihre 'disneyViewController' in der Hauptwarteschlange versenden. Es ist auch nicht notwendig, '' '' auf 'NSUserDefaults' zu synchronisieren. Der Grund, warum Sie können nicht die 'print (Nachricht) finden Sie unter' ist, dass der Netzwerkbetrieb (im Hintergrund) asynchron abgeschlossen ist, so dass, wenn der Druck der Daten ausführt, hat sich nicht aus dem Netz noch abgerufen wurden – Paulw11

Antwort

0

Sie müssen Ihre JSON-Ergebnisse dispatch_async. Sie können mehr lesen here. Sie können auch AlamoFire oder SwiftyJSON verwenden, um Ihnen dabei zu helfen. Dies sind sehr gute JSON-Tools. Sie können sie googeln.

Zuerst deklarieren Sie Ihre userid Variable außerhalb der JSON-Antwort. Vorzugsweise in der ersten Zeile Ihrer Methode. Dann aktualisieren Sie Ihre Codes wie folgt.

for person: NSDictionary in custdetails { 
    userid = person.valueForKey("CustId") as! String 
} dispatch_async(dispatch_get_main_queue(),{ 
     print(userid) 
     if(userid != ""){ 
      self.dismissViewControllerAnimated(true, completion: nil) 
      self.message = jsonResult["message"] as! String 
     } 
}) 
Verwandte Themen