2015-07-21 54 views
0

我目前正在挣扎在viewController上的一个小问题。我存储了用户信息以保存用户登录状态,无论如何,当用户打开应用程序时,他们会显示一个“配置文件”页面。我试图(在这个例子中返回电子邮件)返回与该用户相关的值作为应用程序打开,但不知道如何执行控制器本身的代码,我的JSON张贴在下面,并返回正确的所需信息。然而,我的标签仍然不会获得打开应用程序时存储的用户电子邮件的价值。标签保持空白!Swift JSON解析执行viewLoad

let myUrl = NSURL(string: "http://www.mywebsite.co.za/php/scripts/getuserEmail.php"); 
    let request = NSMutableURLRequest(URL:myUrl!); 
    request.HTTPMethod = "POST"; 
    let postString = "user_id=\(userId)"; 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding); 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
     { 
      data, response, error in 
      println(" response = \(response)") 
      let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
      println("response data = \(responseString)") 
      var err: NSError? 
      var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err) as? NSDictionary 
      if let parseJSON = json 
      { 
       var userEmail = parseJSON["userEmail"] as? String 
       self.usersEmail.text = userEmail 
      } 
     } 

将基本上像要执行的代码,并作为视图中打开更新我的标记时,用户必须从其他的viewController更改电子邮件已经使电子邮件应相应地更新的能力。任何其他信息将很乐意提供。

增加:println到控制台将不会执行超过myUrl变量的赋值。下面的回复将仍不能正常工作。然而,这是我的viewWillAppear中全码:

override func viewWillAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    let userFirstName = NSUserDefaults.standardUserDefaults().stringForKey("userFirstName") 
    let userLastName = NSUserDefaults.standardUserDefaults().stringForKey("userLastName") 
    var userFullName = userFirstName! 

    userFullNameLabel.text = userFullName 

    let userId:String? = NSUserDefaults.standardUserDefaults().stringForKey("userId") 
    let imageUrl = NSURL(string:"http://www.mywebsite.co.za/profile-pictures/\(userId!)/user-profile.jpg") 


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
    let imageData = NSData(contentsOfURL: imageUrl!) 

     if(imageData != nil) 
     { 
      dispatch_async(dispatch_get_main_queue(),{ 
      self.profilePictureImageVIew.image = UIImage(data: imageData!) 
      self.profilePictureImageVIew.backgroundColor = UIColor.clearColor() 
      }) 
     } 
    } 


    // Send HTTP POST 
     let myUrl = NSURL(string: "http://www.mywebsite.co.za/php/scripts/getuserEmail.php"); 
     let request = NSMutableURLRequest(URL:myUrl!); 
     request.HTTPMethod = "POST"; 
     let postString = "user_id=\(userId)"; 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding); 
     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
      { 
       data, response, error in 
       // You can print out response object 
       println("******* response = \(response)") 
       // Print out reponse body 
       let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
       println("****** response data = \(responseString)") 
       var err: NSError? 
       var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err) as? NSDictionary 
       if let parseJSON = json 
       { 
        var userEmail = parseJSON["userEmail"] as? String 
        self.usersEmail.text = userEmail 
       } 
     } 
} 

回答

0

如果我理解正确的,你说出现的页面和你的网络电话还没有结束,并分配给self.usersEmail.text但。我在我的项目中所做的是在主队列中异步地分配类似于你的块中的命令。尝试在您的if语句中执行此操作:

dispatch_async(dispatch_get_main_queue()) { 
    var userEmail = parseJSON["userEmail"] as? String 
    self.usersEmail.text = userEmail 
} 

希望这会有所帮助。这可能是不恰当的,但希望有人可以让我知道,如果是这样。它迄今为止适用于我。

您还需要恢复其块后task

let myUrl = NSURL(string: "http://www.mywebsite.co.za/php/scripts/getuserEmail.php"); 
    let request = NSMutableURLRequest(URL:myUrl!); 
    request.HTTPMethod = "POST"; 
    let postString = "user_id=\(userId)"; 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding); 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
     { 
      data, response, error in 
      // You can print out response object 
      println("******* response = \(response)") 
      // Print out reponse body 
      let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
      println("****** response data = \(responseString)") 
      var err: NSError? 
      var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err) as? NSDictionary 
      if let parseJSON = json 
      { 
       var userEmail = parseJSON["userEmail"] as? String 
       self.usersEmail.text = userEmail 
      } 
    } 
    task.resume() 
0

谢谢grdavis,标记为答案,但我需要改变一些东西拿到我想要的结果,我只是想张贴更新后的答案。

  1. 移到viewDidLoad中,而不是viewWillAppear中
  2. 当监视控制台中的用户ID并不孤单过这样的URL添加发送当“!”到过的网址发送
  3. 之前修正了这个字符串的恢复工作

下面是我更新的代码,再次感谢你。标签更新喜欢:

// Send HTTP POST 
    let userId:String? = NSUserDefaults.standardUserDefaults().stringForKey("userId") 
    let myUrl = NSURL(string: "http://www.mywebsite.co.za/php/scripts/getuserEmail.php"); 
    let request = NSMutableURLRequest(URL:myUrl!); 
    request.HTTPMethod = "POST"; 
    let postString = "user_id=\(userId!)"; 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding); 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){ 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
     { 
      data, response, error in 
      // You can print out response object 
      println("******* response = \(response)") 
      // Print out reponse body 
      let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
      println("****** response data = \(responseString)") 
      var err: NSError? 
      var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err) as? NSDictionary 
      if let parseJSON = json 
      { 
       var userEmail = parseJSON["userEmail"] as? String 
       println("******* userEmail = \(userEmail)") 
       self.usersEmail.text = userEmail 
      } 
     } 
    task.resume() 
    }