2015-07-21 53 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() 
    }